Move cost, cardinality, and solvedPredicates back into LogicalPlan

o Replaces PlanTableEntry with LogicalPlan
o Pulls cost and cardinality estimation code out of planners into logical plans
o Some clean up and test refactoring on the side
Move SemanticTable into LogicalPlanContext and cleanup leaf planners

o Unravels issue around Identifier <-> IdName confusion:
   (1) Might want to replace IdName with Identifier again since we don't have types for the latter
   (2) IdNames can be ambiguous due to name shadowing
Pull LogicalPlanContext out and turn {SimpleLogical|Projection}Planner into objects
Changed the algorithm for picking the best plan

Instead of picking a best plan from all the initial plans, we now pick a best plan per set of covered ids

Also disabled relationship seeks in ronja until we support relationship patterns.
Refactoring to make SimpleLogicalPlanner easier to test
First stab at taking care of predicates in Ronja

* Adds a Selection logical plan
* Adds a selectionApplicator, which is the class responsible
  for applying predicates when possible
* Makes expandAndJoin and the initialiser use it for each plan that
  is produced
Adds PipeMonitor to the FilterPipe, since it's used from Ronja
Use for comprehensions in IndexLeafPlanner and LabelScanLeafPlanner
Introduce the notion of a scope in semantic state

This way, we can accumulate arbitrary information across a semantic check
(such as type information for all encountered identifiers)
without polluting the scope state.
Add cartesian product to Ronja
Collect all predicates found in WHERE clauses
Apply predicates after cartesian product when relevant