ngAnimate enhancements

## Fixes to Transitions / Keyframe Animations
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/

## Cleanup
Remove a useless test from ngAnimate

## Fixes to Staggering animations
Broken with 1.2.5+ due to closing timeout feature.

## Fixes to performance
Use `requestAnimationFrame` instead of $timeout to issue a forced reflow.

## Animation callbacks
Added a new feature to tap into callbacks before and after animations DOM events are called.