So I actually looked at what it would take for the common user to implement a dispatcher like this, and I'm not sure I like what I'm seeing.  The bare idea (apologies for the crudity) looks like this: https://gist.github.com/johto/7836236.  The logic around supporting Unlisten() gets particularly hairy (imagine what happens if someone just comes in wanting to Listen when the last Listener went away, and the order of the operations on the Listener ends up being different from how they were serialized on the NotifyDispatcher).  Blocking all dispatching while we wait for Listen()/Unlisten() to finish seems unacceptable.

On top of that, there are a number of things which I believe we have to simply decide on behalf of our users:
  1. What happens if the Listen() on the Listener fails?  Do we retry indefinitely?
  2. What happens if a channel's buffer fills?  Drop the channel?  Wait indefinitely?
  3. What's the buffer size on these channels?  Or does the user bring his own channels?  Is the dispatcher allowed to close the channel if the dispatcher gets Close()d?

Perhaps something I've missed?  Any thoughts?