Use ReaderT and StateT for synthesis

We wrap the synthesis computation in a `ReaderT GameStructure` and
`State (Int, Int, Int)` pair of monad transformers. This allows us to
avoid passing the current indices `j` and `i` and the game structure
explicitly.
WIP - saving intermediate steps