Completion & Context Suggester: Support real-time deleted document filtering for suggestions

Idea:
  - encode lucene docids to corresponding FST outputs
  - make sure no surface form is lost even though there may be exact duplicates
  - use encoded docids to perform real-time deleted doc filtering

Implementation & Considerations:
  - Currently the FST BytesRef Output is in the format:
     `surface_form` + `PAYLOAD_SEP` + `payload` + `PAYLOAD_SEP` + `docID`
  - Duplicate surface forms are stored uniquely with dedup bytes. (uses the `END_BYTE` before the dedup bytes, maybe we can support `exact_first` in the future)
  - `maxAnalyzedPathsForOneInput` is now dynamically set by taking into account the # of surfaces per analyzed form (to deepen the `TopNSearcher` queue)
  - This implementation modifies the `XAnalyzingSuggester` further, I think it is a good idea to make lucene's `AnalyzingSuggester` more pluggable instead in the future.
  - Minor refactoring

closes #7133
I think this pruning (not accepted deleted docs) means the bounded queue in TopNSearcher is not admissible, meaning it's able to prune a path too early when that path would have led to a result that made the topN final results.  The TopResults that comes back from Util.TopNSearcher has an isComplete boolean that is false if the search was over-pruned.

Unfortunately it's not simple to compute up front how much larger a queue we need to use.  E.g. and adversarial case would delete all documents that had good suggestions, causing the other docs to be pruned before they are explored.  Maybe we could do a heuristic, e.g. look at the %tg live docs in the index, and use a larger queue with that ratio... or maybe we should use an unbounded queue in TopNSearcher (but this is possibly dangerous, CPU and RAM wise).