WIP: refactor(ngModelController,formController):

I am assigned to following issues and found that the current
logic for async validation in ngModelController and formController
is not maintainable:
- control logic is in multiple parts, e.g. `ctrl.$setValidity`
  waits for end of promises
- logic for updating the flags `ctrl.$error`, `ctrl.$pending`, `ctrl.$valid`
  is super complicated, especially in formController


I made the following changes (almost through, only some tests are still
failing):
- simplify async validation: centralize control logic
  into one method
  * remove counters `invalidCount` and `pendingCount`
  * use a flag `currentValidationRunId` to separate
    async validator runs from each other
  * use `$q.all` to determine when all async validators are done
  * remove fields from `ctrl.$error` that are valid,
    instead of leaving them there with value `false`
    -> make logic more consistent
  * remove diff calculation, always calculate the correct state anew,
    only cache the css classes that have been set to not
    trigger too many css animations.
- centralize way how `ctrl.$modelValue` and `ctrl.$invalidModelValue` 
  is updated
- simplify `ngModelController/formCtrl.$setValidity` and merge
  `$$setPending`, `$$clearControlValidity/$$clearValidity/$$clearPending`
  into one method, that has the same code in `ngModelController` AND
  `formController`
- minor bug fixes encountered in the tests because of this centralization:
  * only read out `input.validity.badInput`, but not `input.validity.typeMismatch`,
    as parser error (leads to problems when using `type=email`)

@matsko What do you think?
/cc @IgorMinar 
Yes,
so the problem is only with `input[date]` and `input[number]`, as we don't have a way of getting the entered value if their parser fails. However, for email, url, ... we do get the entered value of the user, even though it might not be an email/url/ ... and we also want to run the other validators as well (like minlength, ...)

Always using our own validation in JS makes sense to keep it consistent across browsers that do and don't support this natively