feat(injector): implement a different approach to injector scopes

An easy way to review this is to read the tests and see if that's what we want
Let's call it `Scope` to make it consistent. Or `DefaultScope`, `BaseScope` or something?

I think you are right and we might rename all of the annotations to `*Annotation` but that can be done in a separate commit. The reason why I didn't do that already was that then people have to import it as `import {InjectAnnotation as Inject} from 'di';`... and that kind of sucks....

We should probably separate all these annotations to a separate module because often projects only need the annotations (so that their code can be used with DI) but they don't need the actual DI. Then, I think `Inject`, `Scope`, etc. will be fine...

What do you think?