Add force started splits to task handle so they can be destroyed
Add close to ExchangeOperator to assure ExchangeClient is closed
Optimize DomainTranslation of BETWEEN ranges
Simplify the effective predicate from table scan partitions
Add support for tables with sampled data
Optimizations for sampled data

* Run aggregates directly on sampled data
* Pull materialization up through JOINs and UNIONs
Add more optimizations for sampled tables

Pull materialization up through:
* filter
* project
* top N
* sort
* limit
* semi join
* mark distinct
Move table creation into DistributedLogicalPlanner
Add support for writing sampled tables

* Add method to connector SPI to indicate if the connector supports storing sampled data
* Implement storing sampled data in the native store
* Add benchmarks for queries over sampled data

Benchmarks show that the materialization optimizer makes queries on sampled data (with a weight of 2) 118% to 682% faster

Benchmarks without optimizer:
sampled_sql_groupby_agg_with_arithmetic  :: 3739.602 cpu ms :: in    6M,   189MB,    1.6M/s,  50.5MB/s :: out     2,     30B,       0/s,      8B/s
sampled_sql_count_agg                    ::   28.461 cpu ms :: in  1.5M,  12.9MB,   52.7M/s,   452MB/s :: out     1,      9B,      35/s,    316B/s
sampled_sql_join_with_predicate          :: 2371.573 cpu ms :: in  7.5M,   180MB,   3.16M/s,    76MB/s :: out     1,      9B,       0/s,      3B/s
sampled_sql_double_sum_agg               ::  180.579 cpu ms :: in  1.5M,  25.7MB,   8.31M/s,   143MB/s :: out     1,      9B,       5/s,     49B/s

Benchmarks with optimizer:
sampled_sql_groupby_agg_with_arithmetic  :: 1008.255 cpu ms :: in    6M,   189MB,   5.95M/s,   187MB/s :: out     2,     30B,       1/s,     29B/s
sampled_sql_count_agg                    ::   12.934 cpu ms :: in  1.5M,  12.9MB,    116M/s,   995MB/s :: out     1,      9B,      77/s,    695B/s
sampled_sql_join_with_predicate          :: 1005.354 cpu ms :: in  7.5M,   180MB,   7.46M/s,   179MB/s :: out     1,      9B,       0/s,      8B/s
sampled_sql_double_sum_agg               ::   22.906 cpu ms :: in  1.5M,  25.7MB,   65.5M/s,   1.1GB/s :: out     1,      9B,      43/s,    392B/s
Add unit tests for MarkDistinctOperator and MaterializeSampleOperator
Add optimization for DISTINCT LIMIT queries over sampled data
Refactor TableWriterOperator to take output types in the constructor
Address comments on pull request

* fix optimization of LEFT, RIGHT, and OUTER joins
* fix optimization of UNION
* fix a bunch of stylistic issues
* add more tests
Change filter operator and expression compiler to handle pages with zero channels
Run all AbstractTestQueries over sampled data with a weight of 1
Experimental support for approximate queries

Currently only AVG is supported. The syntax is:
SELECT AVG(a)
FROM my_sampled_table
APPROXIMATE AT 95.0 CONFIDENCE

This is disabled by default, but can be enabled with the config option analyzer.approximate-queries-enabled=true