Set: Order the layout in columns rather than rows.

This may seem silly, but what it does is keep the cards from jumping
around when new ones are added due to no set being found.  When it
was ordered by rows, that shifted all cards on the second row to
the left one and on the third row to the left twice.  If you were
in the middle of typing out a set, the values likely changed.  Now
they are stable when cards are added, which is a clear win.
Set: Move to using bitfields; structures.

This should have been done in several steps, but I ended up conflating
them.  Anyhow, we now use bitfields to determine the third card of a
set when given any two other cards, and that functionality is also used
by is_a_set() (which is a single line now) and by the function that
determines whether or not there are any more playable sets.

The conflation is that I /also/ switched to using structures to hold
all of this information rather than the previous strings where I did
stupid pet tricks depending on what the string was.  Both worthwhile
changes, but the result is that two changes that could have been
separated are not.  Ah, well.
Set: Handle "/" as a separator as well.

Just to be nice.
Set: Add count as an alias for 'cards'.

I follow the rule: when typing in a hurry your hindbrain thinks it
should be this five times in a row, it should probably be a supported
alias.
Hex: Store a printable board representation.

This way we don't regen the thing every time someone looks, or do it
over and over again for each player after each move.
Y: Store a printable board representation.

See previous commit for details.
Set: Store a printable board representation.

See previous commits for details.  This is probably the game where
it's the biggest win, to be honest, as the printing of the Set
layout is rather stupidly complex.
Set: Update layout at the start of the game.

How did I miss this?  I dunno, but I did.  It actually doesn't
matter... unless someone looks at the layout before the game
starts.
game: Improve kibitizing.

It now shows you the board, and informs you if you're already
watching the game.
chat: Add games as an alias for game.

Another one of those "I've typed it enough times that it should be
an option" things.
Set: Credit the inventor.

Because it's nice.
Major new feature: Breakthrough.

A very simple but very strategic abstract strategy game.  This
implementation is quite configurable when it comes to board
sizes.
Breakthrough: add support for mv xx-yy.

At Stella's request (and it's a smart choice anyhow, as that's how
(say) Chess games are notated.)
Breakthrough: Colourize board better.

On-board dots are brighter magenta now, and the border is darker
magenta.  It stands out better from the numbers, but isn't too
distracting.  Success!
utils: New major utility, demangle_move().

This function does most of the nasty gubbins of getting a meaningful
move (or sets of moves) out of a string like "a3-b6" or "a3, b6, c5".
Set: Convert to using demangle_move().

This conversion means set is way, way more generous with the moves
it takes.  That's only a good thing in a game built on speed.
Breakthrough: Convert to demangle_move().

Code savings and improved move clarity for the win.
Hex: Convert to demangle_moves().

More simplification and code savings.
Y: Convert to demangle_move().

And thus ends the conversions and simplifications of existing games.
Set: Update comment in no_more_sets().

I broke out the "determine the third card" logic into its own
function, so the comment here, while still correct, was way too
detailed (and also duplicated the internal documentation of that
function).