Change Rewriter to be a total function

Now it's a function from AnyRef to AnyRef rather than AnyRef to Option[AnyRef].
In practice, some of the combinators already made assumptions about it being
a complete function.

It is possible to construct a partial rewriter by lifting a partial function,
which will fall back to the identity function if not applicable.

Shallow profiling didn't show perf improvements but it still seems like a good change.

Remove specialized branches from reverseProductIterator that were showing up in the profile.

BottomUpRewriter now uses mutation and a loop to increase performance.

Signed-off-by: Jakub <jakub@jakub.cc>