Register an event handler
@param identifier {string} the event type (first part of event definition)
@param handlerOrOptions {function(options, callback) *OR* options object}

handlerOrOptions as function(options, callback) a function which returns the object used as the event handler.
@param options {object}: will contain a *path* attribute - the event key (without the handler key prefix).
if the custom handler was registered as "foo" and events hash was { "foo:abc": "..." }, the path is "abc"
@param callback {function}: the callback function to be bound to the event

handlerOrOptions as options: will use a predefined "standard" handler;  this assumes the event format of "{handler identifier}:{target identifier}:{event name}"
@param target {object or function(targetIdentifier, eventName)} the target to bind/unbind from or the functions which retuns this target
@param onKey {string} the attribute which identifies the event binding function on the target (default is "on")
@param offKey {string} the attribute which identifies the event un-binding function on the target (default is "off")
function(identifier, optionsOrHandler) {
            if (typeof optionsOrHandler !== 'function') {
                // it's options
                optionsOrHandler = handlerTemplates[optionsOrHandler.type || 'standard'](optionsOrHandler);
            }
            if (identifier instanceof RegExp) {
                patternHandlers.push({
                    pattern: identifier,
                    handler: optionsOrHandler
                });
            } else {
                handlers[identifier] = optionsOrHandler;
            }
        }