Include both sources in IndexNode sources list

getSources() is meant to return all subplans of a given node as it's
used for various plan-walking activities.
Implement PlanRewriter as a regular visitor

The rewriter interface abstraction is unnecessary.
Replace inner classes with lambdas
Isolate beginCreate/beginInsert plan rewriting logic

It's currently embedded in DistributedLogicalPlanner. This commit
moves it to a separate optimizer in preparation for making the distributed
planner just another optimizer, too.

The current implementation is a big hack that we need to fix eventually.
This logic should be invoked on query start, not during planning. At
that point, the token returned by beginCreate/beginInsert should be
handed down to tasks in a mapping separate from the plan that links
plan nodes to the corresponding token.
Allow internal plugins to register parametric types
Fix output type of learn_regressor() function
Make Classifier a parametric type
Add support for string labels to ML plugin
Add serialization id test for unit normalizer
Fix IntelliJ warnings in MLFunctions
Generalize evaluate_classifier_predictions

It now works with multi-class classifiers and also with string labels
Remove unnecessary synchronization from MLPlugin
Fix IntelliJ warnings in AbstractSvmModel
Fix to add bufferIds for the tasks created during waitForFreeNode

Fixes #2135
Add getColumnTypes API to RecordSink
Add PageSink to SPI