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 also performs null checks as appropriate (ignoring null values).
* The documentation for `loadClass(String)` now specifies that `null` should not be returned (and instead an exception should be thrown).