Class ASTSimpleOptionalOptimizer

A "simple optional" is an optional sub-group that contains only one statement
pattern, no sub-groups of its own, and no filters that require materialized
variables based on the optional statement pattern. We can lift these
"simple optionals" into the parent group where the join evaluation will be
less expensive.

Note: When the filter is lifted, it must be attached to the statement pattern
node such that toPredicate() puts them onto the predicate since they must run
*with* the join for that predicate. (The problem is that ?x != Bar is
filtering the optional join, not ?x).