feat(directive-injector): detect and throw on circular deps

The maximum depth for depth for dependency resolution is set to 50.
No performance degradation observed on tree benchmark.
Yeah, this is enforced because getByKey is the only public method (get just redirects to it) and we are guaranteed to go through it exactly once per resolution. 

We should be careful not to introduce other public methods for getting items.