throw error on load timeout; timeout is configurable (in milliseconds)

This resolves the "todo" to give consistent notice of unresolved modules. This is a harsher treatment than the original approach which simply logs the issue, but I believe this is desirable.

Not yet done but would be nice to do: include the list of dependencies that the failed module is still waiting for. Given present implementation, if a module is listed as a dep but never defined, it isn't added to the waitingModules hash, so it isn't trivial to include such a dep in the error message.