Use class_name provided by association

A user may specifiy a class_name on the association. We should respect
this setting otherwise we may try to constantize a non-existent class.
Add support for self-referential preloading