Be more consistent about exceptions thrown/caught in Schema::find

The Python-level code, which loops over all the C++ template instantiations until it
finds one that doesn't throw, was catching all Exceptions, not just those that meant
the field couldn't be found with the given type.
Perform Schema alias replacement recursively, and check for cycles.

Note that the implementation is not recursive (more efficient as a loop).
Merge branch 'u/jbosch/DM-1282'