Factor out the rules for merging tiles.

The old code hard-coded the rule "a.value === b.value" in two places,
and also hard-coded the merged tile's value as "a.value * 2".  To make
it easier to hack together variant versions, I've factored this logic
out into a single function GameManager.resultOfMerging(from, to).
If the tiles can't be merged, the function returns null.
If they can, the function returns an appropriately initialized new Tile
(except that the position may safely be left as "null").

No intended functional change.
Yes, that expression seems equivalent to me. I just find my version easier to read, because it maps directly to how I think about the logic:

    Is there even a next tile? If not, can't merge. Yield null.
    If we've already done our one merger per row traversal, can't merge. Yield null.
    Otherwise, yes, we can attempt a merge (which might still yield null).