Tidy up DynamicLibrary API

Two main changes here:
 * Split the "open" function to two, "load" and "main_program". I see no need to model this API on posix, where you can pass NULL as a parameter. Intuitively, what does it mean to "open(None)"? Also, calling it "load" since it not only opens the library file but also loads it into memory.
 * DST-ify the API, take parameter as borrowed ref instead.

[breaking-change]