add support for linux dynamic dll loading

First stab at supporting dynamically loadable shared libraries under Linux. It's magical, because (thanks to @dawgfoto's ideas) you don't have to do anything other than use the Linux API to load/unload DLLs. They initialize themselves!

(Currently won't work if you try to load DLLs at the same time from different threads, needs some synchronization.)

Also needs some thought towards what should happen if an exception is thrown during module construction/destruction.

Once we get thoroughly satisfied that this is right, we can extend it to the other platforms.