Use duck typing in error classes

Let each class decide how to describe the error, rather than forcing SchemaError
to have knowledge about another class.

I've left SchemaError.aggregate in place to avoid breaking uses external uses
of it, although it no longer has much purpose.