Pr/3098

I've fixed up https://github.com/silverstripe/silverstripe-framework/pull/3098, rebased it, squashed the commits, fixed the test cases, and made a few API suggestions.
Sorry, I think I might have dumped your API extension to injector since it wasn't necessary anymore. I need to re-review all of these docs and make sure they make sense.