feat(NgModel): introduce the $validators pipeline
fix(NgModel): make sure the required validator uses the $validators pipeline

Fixes #5164
fix(NgModel): make sure the pattern validator uses the $validators pipeline
fix(NgModel): make sure the ngMinlength and ngMaxlength validators use the $validators pipeline

Fixes #6304
fix(NgModel): make ngMinlength and ngMaxlength as standalone directives

Fixes #6750
fix(NgModel): ensure pattern and ngPattern use the same validator

When the pattern and ng-pattern attributes are used with an input element
containing a ngModel directive then they should both use the same validator
and the validation errors of the model should be placed on model.$error.pattern.

BREAKING CHANGE:

If an expression is used on ng-pattern (such as `ng-pattern="exp"`) or on the
pattern attribute (something like on `pattern="{{ exp }}"`) and the expression
itself evaluates to a string then the validator will not parse the string as a
literal regular expression object (a value like `/abc/i`).  Instead, the entire
string will be created as the regular expression to test against. This means
that any expression flags will not be placed on the RegExp object. To get around
this limitation, use a regular expression object as the value for the expression.

    //before
    $scope.exp = '/abc/i';

    //after
    $scope.exp = /abc/i;