Optimize event emission

This pull request lays some foundation work for subsequent changes for the event system.  As new features get added to the event system, I put some work in making the event emission more efficient to offset the cost of these new features.  The changes here are:

* Switching from an recursive to iterative lookups.
* Adding fast short circuit when there are no handler registered to an event (common case)
* Removed the internal `_Node` class and just used a dictionary instead.  The `_Node` class had no behavior and had no benefits from being an object.

There are no functional changes.