The ModuleManager class centrally manages dynamically loaded modules.
It maintains a mapping of URLs to modules.
A module can exist in a state where it is already loaded
(and ready for use), or in a not-loaded-yet state.
The ModuleManager dispatches events that indicate module status.
Clients can register event handlers and then call the
load() method, which dispatches events when the factory is ready
(or immediately, if it was already loaded).