Today I took on some backlog. The dispatcher has replaced the old macro-based distributor (which was limited to the specifics of p2p). It's also been used to implement http messaging. But we had another similar mechanism in the broadcaster. This is what allows a protocol (on a given channel) to push out a message (e.g. p2p message object) to internal subscribers. So it subscribes to a message type on the distributor, and pushes out a message via the broadcaster. Subscription to broadcaster messages is available to any part of the node (channels, sessions, logging, chasers, etc).
Since this is process-wide (lives on the network/node/server object), so not limited to a channel, it requires explicit desubscription. That requires a desubscriber object as opposed to the subscriber/unsubscriber objects used internally by the dispatcher. So this required an interface expansion on the dispatcher, which I ended up implementing as a broadcaster<Interface> derived from the existing dispatcher<Interface. So now all dispatch/broadcast is implemented in the same templates, and the big macro-based hacks are gone.