ENHANCEMENT: Form action handlers can now do custom validation by throwing ValidationExceptions.
API CHANGE: ValidationResult can now store field-specific errors.
API CHANGE: The response format of Ajax/JSON based validation has changed.
API CHANGE: You can pass a string error message to the ValidationException constructor.

This is a work in progress, and isn't yet ready for merge.  There are a few

 * The "success message" of forms doesn't have a nice home; it's currently entirely separate from the one managed by ValidationResult.
 * The ValdiatonResult object could probably be given more thought; Symfony Validator might be a place to look for missing APIs.
 * JSON/Ajax validation errors have been from one arbitrary definition to another.  It should probably be spun out into a ResponseHandler of some kind.