Aggregations: new “Sampler” provides a filter for top-scoring docs

Used to limit processing in child aggregations.

The existing Aggregator base class support for deferring computation of child aggs is modified (DeferringBucketCollector is refactored to be abstract and the logic it had for “best bucket” trimming is pushed down into a new BestBucketsDeferringCollector while the new logic for trimming based on doc score quality is in subclass BestDocsDeferringCollector).
Closes #8108
@jpountz Thanks for the review. I think adding the random sampling was beneficial if only to refactor deferring collector base class to allow for other forms of determining "top" collections.

I have a potentially more useful feature in mind to add - a "diversity filter" which ensures the selected sample is free of duplicate sources of information e.g. you could de-dupe on the "orginal_author" field of an index full of tweets or the "email_thread_id" of an index of emails. The reason for using this would be to avoid a single voice dominating any analysis. The implementation would have to be a bit smart and select the best scoring doc for each key in order for the key's doc to be competitive. This may be an interesting challenge to implement efficiently.

I'm not sure if this "diversity filter" should exist as part of the sampling agg or could provide a useful  feature as a stand-alone agg. An example e-commerce requirement might be to query a product database for the best matches but at most bring back 3 products from any single manufacturer.  You can get some of the way there using existing aggs ( [see this gist] (https://gist.github.com/markharwood/5cf012ce296305306e3a) but it has issues and I expect pagination will always be a problem with this sort of logic. It's probably a mistake generally to mix pagination and aggs.

I'll save the "diversity" logic for another PR but it is worth considering how we design the Sampler DSL if we hope to add this sort of extension in future.