maybe it's a bit much to hack on an IOC container for this in this change, maybe we can keep it like this for now and I'll work on adding an IOC container seperately, unless you're interested in adding that (but maybe it should still be in a separate CL, just to make this one easier to review).

It's true that grunt makes things a little bit awkward, but it's not all bad. You can have a file, like `modules.js` which exports a function that creates the default modules, and define an entrypoint for mocking default modules there. The grunt task itself can create the injector by requiring those modules, and adding the `grunt` provider if it's not determined to be already present in the module, so that a mock is not overwritten.

Does that make sense? It should be a pretty simple architecture, but it's true that Grunt makes it a bit awkward to build that.