fix(filterFilter): correctly handle deep expression objects

Previously, trying to use a deep expression object (i.e. an object whose properties can be objects themselves) did not work correctly. This commit refactors `filterFilter`, making it simpler and adding support for filtering collections of arbitrarily deep objects.

Closes #9698

---
<sub>
BTW, I used "non-IE8" stuff (like `Array.prototype.some/every`) for the sake of conciseness and clarity, so this is not directly back-portable to 1.2.x. If there is interest, I can create a IE8 compatible version (using `for-loops` etc).
</sub>
I still don't feel like this is correct.

It's a breaking change to not care about inherited properties --- and the fact that the property is inherited isn't really the issue, the issue is that we care about properties which are functions at all (they're hard coded to always return `false`).

I haven't checked how your patch is addressing this, but I think it's important that we A) keep the existing behaviour of looking at inherited properties, and B) don't do the wrong thing for function values.