Event Improvements

* Added async event support
* Added a `dispatch()` event for emitting custom event objects
* Split `Observer` into its own class

Fixes #28