fix(*): protect calls to hasOwnProperty in public API

Objects received from outside AngularJS may have had their `hasOwnProperty`
method overridden with something else.
Also, we may be using an object internally to store/cache a hash-map, where
the keys for the map are provided from outside AngularJS.

In such cases we must either call directly against
`Object.prototype.hasOwnProperty` or provide some other way of preventing
our objects from having hasOwnProperty overridden.

Closes #2141