Improve custom error handling.

The `Schema` 'error' kwarg now supports a callable, which returns the error message as a string. Its arguments are:
  - `schema`: the underlying schema object
  - `data`: the data being validated
  - `reason`: a string constant for the type of error encountered
  - `details`: further details about the reason for the failure.  may be an exeption, a string, or None

Additionally, error strings passed to the `Schema` 'error' kwarg are now provided more context about the error in the form of four `{fields}` for use with "new-style" string formatting.  These are string representations of the four arguments described above.