Break up PlanningStrategy

Now two parts solve CypherQueries together -
QueryGraphSolver solves the actual MATCH part
of a query, and QueryPlanningStrategy handles
projection and WITH.
Add AggregationProjection

This allows a PlannerQuery to represent a query
with aggregation
Made cartesianProduct use greedy planning