Event handlers should be per client

This PR includes two changes that need to go together:

1) Expose the ability to register events via a client interface.
2) Each client should have its own set of event handlers.


For (1) in order to avoid namespacing issues with operation method names, I've added a `.meta` object similar to what's done for boto3.
I think in the future we'll move stuff that's currently in the `ClientCreator` class (like the service model) over to the ClientMeta class.

Additionally, in order for the client to properly support it's `clone` method, we also need the ability for each client to have its own handlers.
Now whenever a client is created, the current set of event handlers is copied.

This means that if a client then registers event handlers through the `.meta` object, other clients will not be affected.

And finally, in order to actually support per client event handlers, the `hooks` module actually needs the ability to create a copy
of the `_PrefixTrie`, which stores the mapping of event names to event handlers.


cc @danielgtaylor 
After thinking about this for a bit, I can't actually come up with a use case where a user would want to pass in a custom event_emitter to clone_client.  I'd think you'd want the default behavior which is to get a copy of the events.  And even if you wanted to modify the events, you could always just access `cloned.meta.events` if you wanted.

Unless there's a compelling use case I'm not thinking of, I'd opt to remove this feature and keep it simpler until we need this.  We can always add it later.