events: add initial observer support

Users can add an event emitter observer that will call a callback
whenever an event emitter is created. A storage value can also be passed
or returned that will persist with the event emitter instance.

The observer events before/after/error/add/remove will be added in the
future. Also with the ability to add an observer to an event emitter
that has already been created.
events: add observer to individual instance

Can add an existing observer to an existing event emitter instance.
events: add before/after observer callbacks
events: WIP add error callback
events: add detachObserver() API

Users can now "detach" an observer instance from an existing
EventEmitter instance.
events: cleanup comments and whatnot
events: WIP add add/remove observers
events: centralize observer execution

The technique used is not DRY, but it is fast. Much faster than using
variable length arguments and getting the object property by a passed
string.
domain: use create EE observer

First step to completely remove domains from core.
events: prevent naming collisions

NOTICE: The EventEmitter is reserving all properties that start with a
double underscore. I'd say sorry, but I'm not really.
events: add ref counter to observers

The same observer is only allowed to execute once, but it's possible
that it can be added multiple times. The ref counter makes sure the
observer is only removed after all references are removed.
events: method to return all observers in queue

It may be helpful for debugging to allow users to see all the active
observers in the queue.
domain: use events error observer

Domains have now been completely seperated from core, using the error
observer callback.
FIX: call remove observer for removeAllListeners

Forgot to add an extra conditional that will call the remove observer if
a callback exists.
events: allow error observer to return true/false

The error observer can return whether the error was handled or not.