Event Improvements

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