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 #7323
Closes #9698
test(filter): test expression object with inherited properties

Related to #9984
fix(filterFilter): ignore function properties and account for inherited properties

Closes #9984