Extracted validation rules to enable use without ActiveModel

This is a large pull request, but I hope you enjoy it.  It fixes a number of non-obvious bugs (see commits tagged "Bug fix:" and possibly others) and makes it possible to use the validations outside of ActiveModel.  It is also quite a large refactoring of both tests and implementation to improve readability (which is how I discovered some of the bugs) by revealing intent and making all the cases clear.

I have taken care to make each commit readable in itself, so that it should be easy to see that I don't lose any test cases or functionality along the way.  Some of the commits might seem pointless but I can argue for each and every one of them.

I have updated the README except for the history section, and I haven't changed the version number.  If I may be so bold, I would suggest that you make the next release v1.0 since I believe that this code is now ready for production and general release (with the caveat that I haven't looked at the JS at all).