Switch to TypeScript

Allows us to easily ensure the validity of any code in the library and
gives users the option of IntelliSense with supporting IDEs.

Also added the ability to chain methods onto validators, with an
orUndefined() one provided by default. Added tests to ensure that it
functions as expected, and with minimal modifications to the tests (only
those necessary to adapt to the new chainable Validator object's API)
everything functions as expected. External API remains unchanged, except
for the addition of an `enforce.Validator` object to ease construction
of custom validators.

I have also added a translator between legacy calls to
`Enforce.add(property: string, validator: function(value: any, next:
(errorMessage?: string) => void, contexts?: ContextMap) => boolean);`
and the new Validator objects to help ensure a smooth transition between
any software using Enforce already and the new version.