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.
return type