Enhanced the instruction set to allow random access

Instead of having AdjustCell/SetCell instructions which access the
currently referenced cell, let's use AdjustCellAt/SetCellAt instructions
which take an offset value to directly reference some cell relative to
the currently selected cell. This allows implementing optimizations
which avoid unnecessary intermediate moves.
Implemented new 'singleAccess' optimization phase

This optimization ensures that in any sequence of
AdjustCellAt/AdjustCellPtr instructions, each cell is only
accessed once, and the cell pointer is only updated once (at the
end). E.g. ">++<->" becomes just three instructions:
[AdjustCellAt 0 (-1), AdjustCellAt 1 2, AdjustCellPtr 1]