docs(guide/services): fix another typo
feat(browserTrigger): allow support for custom timeStamps in events
fix(ngAnimate): ensure that delays are always considered before an animation closes

Closes #4028
feat(ngEventDirectives): add `ngCopy`, `ngCut`, and `ngPaste`

Closes #4172, #4170
docs(minerr): fix broken style from long line in nonassign
docs(minerr): fix bad line wrap due to errand nowrap in CSS
fix($compile): collect ranges on multiple directives on one element

The problem was in keeping the values of `attrNameStart` and `attrNameEnd` between directive loop iterations which lead to the compiler looking for multi-element ranges for any directives that happened to be in the directive list after one that was applied on a range. For instance, having a ng-repeat-start and ng-class on a single element with ng-repeat being resolved first made the compiler look for an ng-repeat-end for both ng-repeat and ng-class because the `attrNameEnd` was not reset to a falsy value before the second iteration. As the result, an exception saying the block end element could not be found and the second directive was not actually applied.

Closes #4002