Sped up tag search by eliminating sort operation.
Avoided applications retaining lots of memory in some cases.

We used to call .clear() to keep reusing some ArrayList objects. But in
cases where these objects can occasionally grow very large, this
approach will result in the memory never getting freed. Now we just
re-allocate these lists every time. This avoids memory problems in
long-running programs.
Terms.indexOf(): term not found returns -1 in search mode
HitPropValue serialization now uses words instead of ids.

HitPropValueContextWord(s) used to include term ids in the
serialized string. If used in an URL (such as a URL for viewing one
group after grouping results), these cause the URL to not
be bookmarkable, because the term id might change if the data is
re-indexed. Now, we use the word in the serialized value, so reindexing
doesn't invalidate it.
Changed Searcher instantiation to a static open() method.

Search.open(File) takes the place of the now deprecated new
Searcher(File). The static factory method makes it possible to
change Searcher to an abstract class in the future and move the
implementation to a new SearcherImpl class.

This is useful for unit testing: many methods require a Searcher
object to be passed, but we don't always want an actual Searcher
with the required index on disk. Instead we want to provide a stub
Searcher object. Making Searcher an abstract class and moving the
implementation to a new class makes it easy to create such stubs as
needed.