#130 concurrency improvements

GameController to control access to Grid.

Grid can only be modified when GameController.acquireGrid() is called, which returns an AutoClosable buffer.  On closing of the buffer, the grid is flushed back to the GameController.

A copy of the Grid can be acquired with GameController.getGridCopy() which does not return the Grid in a buffer, but it will wait for any existing buffer to close.