Implement SychronousWorld#tick

This basic tick lets agents move NSEW and propagates boxes into the next state.
Everything can move through everything else.

We introduced a `Sprite` class so `Agent`s and `Box`es can have shared behavior,
like a known location. We're also now storing a list of boxes to iterate through
so we don't have to scan the whole grid to persist them.