I think treating featureless as "no next candidate found" makes a lot
more sense (even though in practice it should be the same, since we
currently only have elements with child / descendant combinators).
This also cleans up a bit more the code, and stops earlier for pseudos,
part, and slotted, which similarly can't find an ancestor once past the
original one we return.
Differential Revision: https://phabricator.services.mozilla.com/D240490