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 disagree that any bug-fix is a breaking change, unless the behaviour was explicitly documented.

For better or worse, this is not how the world works. People are writing applications now, and this change would make an observable difference, which could break applications. Whether it's documented as supported or not, does not really matter here, it's still an observable difference that can break applications.

Besides that, it's kind of the "default behaviour of javascript", so it's sort of implicitly documented due to not being documented as "not supported".

We can't break this.