Recognize GROUP BY materializations.

We can roll up (e.g. implement aggregate({y}) in terms of aggregate({x, y}) but not yet match a project on an aggregate.

Add AggregateRel.copy(RelTraitSet, RelNode, BitSet, List<AggregateCall>); derived classes should override this rather than copy(RelTraitSet, List<RelNode>).

Support condition weakening by removing ORs (previously we could just add ANDs). For example if the target is 'filter(r1, p1 or p2 or p3)' and the query is 'filter(r1, p1)' then the result is 'filter(target, not p2 and not p3)'.