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 
Also, see this test: https://github.com/angular/angular.js/blob/master/test/ng/directive/inputSpec.js#L738

This assumes that `email` is actually a validator, and not a parser, as we apply an invalid value to the model and expect the error to show up. And it also makes sense, as there is no special representation for email or url other than a string in javascript.