so DSOs can be unloaded in any order

This is a start to supporting dynamically loadable and unloadable DLLs.

In particular, now:

1. exception handling should work successfully across dynamic DLLs.
2. static data is now unregistered with the gc when DLLs are unloaded

Lots more to go.