Minor improvements to ClassLoader

This PR attempts to improve `ClassLoader` by making the following changes:
* `ClassLoader.fromMap` will now throw a `ClassNotFoundException` instead of returning `null` when a class is not found in the map. This behavior is documented.
* Added a static `ClassLoader.attemptLoadFrom` method as an alternative to chaining `retry` calls. This method disallows null values.
* Added a factory method `ClassLoader.empty` method which will never successfully load a class.
* The documentation for `loadClass(String)` now specifies that `null` should not be returned (and instead an exception should be thrown).