Detecting errant calls to $watchCollection with angular.equals

Also rearranged the test to make sure that $digest was called early,
so oldCollection can be properly set.
Using a spy to make sure that the expectations are met.
fix(equals): {} and [] should not be considered equalivalent

angular.equals was returning inconsistent values for the comparison between
{} and []:

    angular.equals({}, []) // true
    angular.equals([], {}]) // false

Since these object are not of the same type, they should not be considered
equivalent.

Fixes #2851.
- Adding note to $watchCollection docs about changes in type
  between oldCollection and newCollection

- Making sure both oldCollection and newCollection's keys get
  checked during watchCollectionWatch

- Suppressing duplicate calls to $watchCollection's listener

- Fixing typo: arrayLikelog -> arrayLikeLog