feat($animate): ensure CSS transitions can work with inherited CSS class definitions

BREAKING CHANGE

ngAnimate addClass / removeClass animations are now applied right away. This means
that as soon as the animation starts the class will be added (addClass) or removed
(removeClass) to the element being animated instead of after the -add-active /
-remove-active animations are completed. This allows for animations outside of
ngAnimate to not conflict with $animate.

This commit introduces beforeAddClass and beforeRemoveClass animation event functions and
executes any addClass and removeClass event functions AFTER the class has been added or
removed (this is opposite functionality of how ngAnimate used to work when performing
JS-enabled animations addClass / removeClass animations). If your animation code relies on
any animations being performed prior to the class change then simply use the new
beforeAddClass and beforeRemoveClass animation event functions.
refactor: changes to make all tests work
refactor: small changes to cancellation functions
refactor: split up closure into two functions
refactor: else styling
docs: update the cancellation example
refactor: remove unreached code
docs(ngClass): use a basic ngClass animation example
refactor: rename closing animation function from done to closeAnimation
refactor: renaming callback functions to doneCallback
refactor: rename parent elements to parentElement
refactor: rename the after element to afterElement
refactor: rename runAnimations to invokeRegisteredAnimationFns
refactor: rename method to phase within invoke animations
refactor: remove unnecessary use of checking for an empty animations array
refactor: fn renamed to animationPhaseCompleted within invoke animations
refactor: rename flag to phaseCompletionFlag within progress
refactor: rename flagTimer to closeAnimationTimeout
refactor: createa a function for async doneCallback execution
refactor: remove unused flag from getElementAnimationDetails
refactor: rename parseMaxTime variables