Pull IO dirtying out of update_board, since that is a pure function and
shouldn't be dirtied with the Monad