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'
bugfix: do approximate comparison to initialValue in testBadPatch()

Equality is not guaranteed due to roundoff errors in spline interpolation.