WIP: Optimize the selection of applicable filterable items.

Before, we did a linear scan over the list of filterable
items (e.g. `config.include` modules), and checked if each
is applicable to a particular example or example group. This
linear scan re-performs the same work over and over again, when
you consider there may be many examples/groups that lack the same
metadata keys that would be used for inclusion.

The solution is to memoize that work. We can’t simply use the
example or group’s metadata as the memorization key, though,
as each example and group have different metadata (e.g. the
description and/or location are almost always different).
Instead, we keep track of what the applicable metadata keys are,
and we use those keys as the basis for getting a subset of
the metadata hash of just the keys we care about. We can then
use this new hash as the basis of a memoization key.

This isn’t done yet (the FilterableItemRepository still needs
specs and should handle edge cases like metadata lambdas, and
we also need to apply this to hook filtering and some other
places) but it’s far enough along that I wanted to push it up for feedback.  Some specs are failing.