re: "i think we should deliver messages to receivers directly when we receive them, rather than through a channel ":
Are we concerned about running the callbacks in the same goroutine as the server? A fellow golang enthusiast mentioned that that might be somewhat problematic, which is why I opted for a more channel-oriented approach.
I can change it for now, just wasn't sure if there were specific pros/cons for either design decision.
Also apologies on the formatting, forgot that go prefers tabs over spaces :P
The user doesn't actually need to run the server in a goroutine if they don't want to - if they don't, then handling results on a channel is probably overkill. if they do decide to run it in a goroutine, then I think it's clearest if they decide how to deal with it in their receivers.
re: formatting, no worries - fortunately go fmt takes care of tabs/spaces and all other sorts of formatting details