refactor($animate): use $animate.$$setClassImmediately to save code

I agree that the complexity of how $animate performs is a bit too much, but the reason why we need to this to always be synchronous is to solve the following problem:

```html
<div ng-repeat="..." ng-class="{animated: animationsEnabled}">...</div>
```

The challenge here is that the enter event always gets fired first since the ng-repeat directive has a higher priority than ng-class (this is always true since ng-class must be applied on a per-element basis). Then after the transclusion occurs for each repeated row then ngClass kicks in.

Behind the scenes, with ngAnimate, here's what happens:

```
1. $animate.enter(transcludedElement, ...) is called
2. $animate places a flag to block all other class-based animations on the element and waits for a digest until started its enter animation.
3. $animate.addClass/$animate.removeClass is called which in start an animation, but the animation is **blocked** because of the pending enter animation. This in turn forces the classes to be **applied right away** such that the enter animation can now have the updated className property which will $animate to detect the matching animation events (transitions, keyframes, JS code).
4. One digest fires and then the enter event runs which then runs the enter animation is normal.
```

So the main thing here is that $animate has to guarantee that the classes are processed synchronously such that any structural animations can be handled correctly. Unless you can find a solution that is asynchronous, yet still caters to this particular usecase then this feature won't be updating anytime soon.