feat($animate): coalesce concurrent class-based animations within a digest loop

All class-based animation methods (addClass, removeClass and setClass) on $animate
are now processed after the next digest occurs. This fix prevents any sequencing
errors from occuring from excessive calls to $animate.addClass or $animate.remoteClass.

BREAKING CHANGE

All directive code that expects any addClass, removeClass or setClass animations to kick
off immediately after being called must now be aware that the animation will only take place
once the next digest has kicked off. Also note that successive calls to $animate.addClass,
$animate.removeClass or $animate.setClass will be grouped together and will not cancel the former
class-based animation (once the digest has passed).
feat($animate): use promises instead of callbacks for animations

The $animate service (both the service inside of ng and ngAnimate) now
makes use of promises instead of callback functions.

BREAKING CHANGE

Any existing directive code that makes use of animation callbacks provided
directly into any of the methods available $animate must now be converted to
use promises instead. Also, the `cancel` function (which was the return value
from each of the $animate methods) is now returned as a member function on the
returned animation promise.

```js
//before
var cancelFn = $animate.enter(element, container, null, callbackFn);
cancelFn(); //cancels the animation

//after (without cancel)
var promise = $animate.enter(element, container).then(callbackFn);

//after (with cancellation method)
var promise = $animate.enter(element, container);
promise.then(callbackFn);
promise.cancel(); //cancels the animation
```