Distinguish between queryCount and disjunctCount

Now that we decompose disjunction queries, writer.numDocs() doesn't return the
number of queries actually added by the user, but the number of queries after
decomposition.  Add a new method, getDisjunctCount() that returns this, and
change getQueryCount() to deduplicate so as to return a more intuitive result.
PresearcherMatch should report its id
Make PresearcherMatches delegate CandidateMatcher public
Matches against an empty monitor should not throw an exception
Allow QueryDecomposer to decomposer disjunctions with exclusions

So, eg, (this that other -take) can be decomposed to (this -take), (that -take),
(other -take).
Allow single-valued conjunctions to be decomposed

So +(hello world) can be decomposed to [+hello, +world].
Test that all presearchers correctly handle ANYTOKEN

* Move ANYTOKEN handling into TermFilteredPresearcher
* ANYTOKEN is now stored in its own special field - per-field handling is
  delegated to CUSTOM token types
* GenericQueryTreeBuilder emits an ANYTOKEN if extractTerms fails
* Remove DefaultPresearcherComponent (all functionality now moved directly into
  TermFilteredPresearcher)
Add OrderedTokenFilter to WildcardNGramPresearcherComponent analysis chain

Document build times are around 40 times higher with this presearcher component
than with the default setup, which is probably due to lots of disk seeks in the
TermsEnumFilter.  OrderedTokenFilter ensures that the token stream being passed
to TermsEnumFilter is in order, which should speed things up.
Commit updates after a fixed number

To stop OOMs, we automatically commit updates in batches of 5000.
OrderedTokenFilter should emit everything with a posinc of 0

Getting integer overflows when building disjunctions from large documents,
because each ngram was being emitted with a posinc of 1.
Add update reporting to Monitor.update()
Remove OrderedTokenFilter from WildcardNGram

Looks like the time is actually being spent in generating all the ngrams, and
OTF actually slowed things down a bit.
Add shortcut to SuffixingNGramTokenFilter to reduce duplication

NGrams are now calculated in suffix order, eg:
alarmXX alarXX alaXX alXX aXX
larmXX larXX laXX lXX
armXX arXX aXX
rmXX rXX
mXX

If a term with a mutual suffix is encountered, then the filter will shortcut
once it reaches the already-seen suffix:
harmXX harXX haXX hXX
armXX <-- already seen, stop ngramming here
Add further shortcut to SuffixingNGramTokenFilter

We add a second cache to the TokenFilter, this time for all seen grams.  If a
gram is encountered that is already in this cache, then move directly to the
next gram starting point.

This has the effect of removing all duplicates in-place, so there is no longer a
need for the DuplicateRemovingTokenFilter (with the exception of wildcard
tokens, which should not be frequent enough to cause problems).