feat: refine runtime error types with specific variants
- split DataPointerOutOfBounds into DataPointerOutsideTapeLength and
DataPointerNegative
- split CellOutOfBounds into CellUnderflow and CellOverflow
- split IoError into IoReadError and IoWriteError
- removed a leftover comment