Fix stemmed best-bet matching.

Somewhat annoyingly, I can't find any way to build an elasticsearch
index + query to perform the best bet checking entirely in elasticsearch
(at least, not without involving large and quadratically growing numbers
of terms in the query, or other nasties).

The problem is that we want to have best bets which are returned
whenever the user's query contains (after stemming and other
elasticsearch analyzer normalization of words) an "stemmed" style best
bet as an exact substring.  For example, the best bet "car tax" should
be matches if the user's query is "car tax" or "car taxes" or "paying
car tax", but not if the user's query is "car" or "tax" or "tax car" or
"car rental tax".

We implement this by introducing a new field "stemmed_query_as_term",
which is populated at index time for best bet documents of type
"stemmed".

If a document is a best bet, and is using the stemmed_query field, we
populate the stemmed_query_as_term field with a processed version of the
stemmed_query.  This produces a representation of the best-bet query
with all words stemmed and lowercased, and joined with a single space.
We use a call to elasticsearch's analyzer to do this processing.

At search time, we process the query similarly, and all best bets with
at least one word in common with the user's query are fetched.  For each
of these the stemmed_query_as_term field of each is checked to see if it
is a substring match for the (similarly normalised) user's query.  If
so, the best bet is used.

There's some tech debt building up in the index.rb file; we should build
a more generic way to modify documents as they're being indexed, since
we now have two special cases there: one for adding the popularity
information, and one for this best-bet modification.  I think this
modification-at-index-time is fine, but we should pull it out
separately.  To do this cleanly requires passing more configuration
about index structures into the indexing code, and I'd like to do it in
a separate pull request given that other branches (eg, the best bet
deletion branch) are already backing up waiting for this one to be
completed.
Add best-bet integration test