Asynchronous client-side validations

Validation is done with jQuery Deferred objects, this should allow
individual validation option functions to return either an explicit
success/failure value as before, or to return a Deferred object.

The Deferred objects need to eventually become an explicit value
matching the same API as direct validation results.