refactor(di): move Dependency from key.js to binding.js
feat(injector): change injector to recover from errors

So it can instantiate an object after a failed attempt.
refactor(injector): cleanup
refactor(injector): change toFactory to use reflector to construct dependencies
style(di): add new lines
refactor(injector): implement support for nested bindings
refactor(di): make use of optional parameters
refactor(di): cleanup to make dartanalyzer happy
refactor(di): simplify Injector API
refactor(di): cleanup