fix(input): use ValidityState to determine validity

In browsers where HTML5 constraint validation is (partially) implemented, an invalid number entered into an `input[type=number]` (for example) input element would be visible to the script context as the empty string. When the required or ngRequired attributes are not used, this results in the invalid state of the input being ignored and considered valid.

To address this, a validator which considers the state of the HTML5 ValidityState object is used when available.

---

It is not entirely possible to test this outside of an E2E scenario, because browsers (or at least Chrome) do not seem to update validity in response to artificial events.

If I can get some help writing E2E tests for this, then I'll be more confident that this is an effective solution.

In the mean time, I'll put together another demo. **[DEMO](http://plnkr.co/edit/qF8rmye9MTbvignmDD7d?p=preview)**

Closes #4293
Closes #2144
Closes #4857
Closes #5120
Closes #5500