Integration of the CachedBuildSideMatchDriver

This is a first version of integrating the CachedBuildSideMatchDriver into the Compiler.
In the current implementation it switches a regular hybrid hash join inside of iterations to the cached variant. The switching is done after the optimization in the NepheleJobGraphGenerator.

I debugged myself through a few of the example iterative algorithms we have and in many cases this implementation correctly switches the driver. But there are some cases where the optimizer decides to use a merge join and that can not so easily be replaced.

All in all I don't like this implementation very much. It is quite hacky and I think we should integrate the cached variant at an earlier point inside the optimization. But that would probably require a few extensions to the cost model. I created an issue to discuss this further:  #795