Add helpers to quickly create interface instances.

While any object can be an interface, oftentimes an interface will just
be a simple placeholder object whose type isn't used for anything except
interfaces. These functions therefore allow the quick creation of such
interfaces, which applications can then expose as a common vocabulary for
describing dependencies.
Keep a cache of bound functions for each injector.

This avoids repeatedly re-binding the same function, as well as
guaranteeing that multiple calls can bind the same function and get the
same result.

The cache of bound functions is not inherited by specialized injectors,
to allow for them to override providers and thus achieve a different
result for the same set of dependencies.