feat(di): add metadata to Key

There are a few places `ElementInjector` currently has to go through to resolve a dependency:

1. ProtoElementInjector
2. "Special objects" (e.g., View, LightDOM)
3. App injector

We can annotate directives and special objects keys with metadata to optimize this process.
may add `:Key` as the return type - also you can add return types on `get` and `numberOfKeys` (which should be a getter)