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...
Personally I think trying to support a modified `Object.prototype` is *not* the right thing. I think it's crazy  :open_mouth:.  How many libraries out there support such a thing? Most prototype-modifying libraries even gasp at such a thing. That seems like going down a rabbit hole to me...

Note that `createMap()` was created for maps where the key is unknown. So you can blindly put keys into the object and then check `if (map[unknownKey])` without using `hasOwnProperty.call`. Or at least that was the original purpose (13d113c522f124b91a1fd8606c22bbd399abf121, d302ea0cfade2787d7cc500398b7dcd3e4eff945, ...) and I don't really see any other use cases today.