[Fixes #490, #488] restore run-time cycle support to the loader.

This does so, while continue to support good error handling semantics.
If the module failed to load, previously it would not fail to load the second time, merely become the empty SEEN object. This results in very crappy debugging experiences.

Also, wrapping the experience in a try/catch would cause different but equally as terrible experiences.

So this solution utilizes a try/finally to correctly set and track state of modules.
Please note, that if an error occurs while loading a module in IE8, it will fail due to no "catch" being present in the try/finally block. But this trade-off seems fair.