Make sure callbacks are invoked at the correct time

The trick with triggering a bind event was causing callbacks to trigger
multiple times. This cleans up the dispatcher code, sends the event name to
callbacks on the `bind` event, and makes sure to only call the callbacks
when necessary.

FAO everyone in #39, please try this out and let me know if it solves your problem.