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>
> My patch does indeed not care about inherited properties (only own properties).

What I'm saying is that previously, we did support properties from the prototype chain, so removing support for this would be a breaking change, regardless of whether it was documented or not.

Since we can't land a breaking change at this point, the right thing to do is not to break this, but instead to make sure that enumerable functions in the prototype chain don't break filtering.