Router
Maps event types to the agents that should receive them.
The router is populated up-front when wiring an agent system and is effectively read-only from then on — it is not thread-safe across concurrent addRoute calls. Looking up agents during dispatch is concurrency-safe because the underlying map is no longer mutated.