feat: asynchronous injection

There are some corner cases that need to be figured out, but the basic stuff works.
feat: provide Injector
fix: testing helpers to work with the async
refactor: move some code to annotations and simplify
refactor: rename parsed annotations
refactor: annotations
refactor: reuse utils in testing
style: make jshint happy
test: use toBePromiseLike matcher
refactor: some more
refactor: create Provider class
refactor: add a todo for future generations