refactor the snake body memory to fix a bunch of bugs

use two separate 256-byte ring buffers (one for x and one for y) instead
of one big 512-byte ring buffer where coordinates are stored next to
each other. this allows wraparound arithmetic to actually do the right
thing rather than requiring a bunch of special handling