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 have somewhat addressed this issue by taking the maximum number of surfaceFormsPerAnalyzedForm as the `maxAnalyzedPathsForOneInput` here (https://github.com/elasticsearch/elasticsearch/pull/7170/files#diff-4320af218ac8c49dca421a906fc16360R192). According to my understanding, this should at least make the `TopNSearcher` admissible. Thoughts?