Make ngAnimate work as closely as possible to natural CSS transitions

NgAnimate and natural CSS transitions are not 1-1 in terms of behaviour (yet), but this fix brings 1.2 to work alongside natural CSS transitions much better. With 1.3 the API will be changed so things are more fluid, but this fix should handle a good amount of the class-based bugs that are appearing in ngAnimate.

Long story short, if you remove ngAnimate from your application it should perform the exact same for CSS-based transitions and keyframe animations triggered by $animate.addClass and/or ngClass.

Closes #5588 
Closes #5191

Here's an example of what should happen:


Natural CSS animations without ngAnimate
http://jsfiddle.net/7vk7p/3/

And this is how it is expected to be with ngAnimate
https://s3.amazonaws.com/angularjs-dev/ng-animate-race-condition-fix/example/animate.html

This is how it currently is:
http://jsfiddle.net/7vk7p/2/