Added a pluggable type resolver classloader system

This makes it possible to use a different classloader from the one that loaded the type being passed in. This is necessary in our case, as we have an attached TypeResolver that may add additional types that actually come from different classloaders.

A classloader resolver allows us to provide our own composite classloader that is able to pull in all of the required types.

The default behavior has been kept the same.