perf(ngmodel/compile): improve ngmodel and general compile/controller performance (#9609)

This was mainly focused around #9609 - bringing 1.3 up to speed with 1.2 with an ng-repeated ng-model, at least when not using jQuery.

Overall these changes make the added benchmark (and the jsfiddle in #9609) 2-3x faster and seem to be faster then 1.2 now.

The last 3 commits (refactoring controller stuff in $compile) can probably be squashed but I left them separate for now for nicer diffs.

The only functional change (that I know of) is that the NgModelController `$name` is now initialized by the directive (pre-link) instead of within the controller. I'm not sure if this an issue or considered breaking? This was already the case for the `$options` field...
I looked a little deeper into it and a `toString` directive would first fail because of `controllerDirectives` (which is also initialized as `{}`). Changing `controllerDirectives` to `createMap()` breaks, because we are using `forEach()` (`which doesn't support "maps"). If I remember correctly, there was a PR about changing `forEach` to support objects created using `createMap()`, but there were some performance concerns and I am not sure what its status is. And even if that was fixed, something might be broken.

So, all things considered, this not worth the trouble atm. `{}` is fine :smile: