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