EventHandler: add optional key attribute

This attribute is a unique subscription key. If multiple EventHandler
annotations exist with the same key, only the first to be subscribed
will be respected; the others will be silently ignored. If no key is
specified, the event handler is always subscribed.

This feature exists to enable better extensibility of event handling:
if code exists that handles an event in an undesirable way, that logic
can be completely intercepted and overridden by writing more code that
handles the event in a better way, specifying the same key as the
original.
DefaultAppEventService: specify subscription keys

This will ensure that only the highest priority event handlers are
subscribed. Specifically, the LegacyAppEventService will take precedence
over the CoreAppEventService, should both of them be present in the
application context.