Refactoring HolmesBot.

Cache lowestPlayableValue(). Also, factor out the logic for deciding if
a particular card is valuable (and whether a particular value COULD be
valuable).

No change in behavior.
Stop using -1 as a flag value in HolmesBot::playedCount_.

Once a particular card has been played to a pile, we know that all its
duplicates must be worthless; but that doesn't mean that we should
forget how many such duplicates there are in play! This patch replaces
a few uses of (playedCount_[k][v] == -1) with (pileOf(k).contains(v)),
which has the same effect. Then we can use the newly informative
playedCount_[k][v] to feed more information into CardKnowledge::update().

This patch insignificantly boosts HolmesBot's average score from 19.33
to 19.35.
Improve HolmesBot's range of available hints.

HolmesBot avoids giving any hint that could be misconstrued as indicating
that some card was playable when in fact it's not. However, if a certain
card's identity would be perfectly known after the hint, then we don't
need to worry about anyone misconstruing its playability. With this patch,
we also observe that if the card is already known to be worthless, then
we don't need to worry about it either.

This improves HolmesBot's average score from 19.34 to 19.41.

For the first time, HolmesBot achieves a perfect score in a handful
of games! (The percentage is still insignificant: 3 or 4 perfect games
per million played.)
Add "SmartBot" (avg score 19.51), a modified HolmesBot.

SmartBot's trick is that it begins to look at non-public information
when playing its cards. If there's a card in its hand which is NOT
publicly identified as playable, but which SmartBot can determine via
deduction is in fact playable, then SmartBot will prefer to play that
card first. (SmartBot can deduce the card's identity by looking around
the table at what cards are actually visible. HolmesBot doesn't use
that information, except when deciding what hint to give; in both bots,
all hints feed into a public information pool. SmartBot is the first
bot to take non-public information into account in a non-trivial way.)

This trick bumps SmartBot's score to 19.51 over HolmesBot's 19.41,
a significant gain of 0.1 points per game. Without using mulligans,
the boost is 0.09 ppg.

The big down side to SmartBot's smarts is that it takes longer than
HolmesBot to compute its move. I'd like to speed it up somehow.