Add support for distributed index joins

This is enabled via a config option and is default off.
Flush join indexes when memory is constrained

Add a separate limit for index memory usage that is independent of the task
memory limit. This removes the risk of the flushable memory usage causing
another operator to run out of memory.

The Loader will make the following attempts when loading:
1) Loading a batch of multiple requests, flushes cache if fails
2) Loading just the single required request, flushes if fails
3) Tries to load the required request with reduced number of positions by factors of 10
Make chr() work with unicode

* Update docs to reference chr() instead of char()
* Make chr() work with unicode code points instead of ascii code points to match the documentation
Refactor ExpressionCompiler

- Remove AbstractFilterAndProject and AbstractScanFilterAndProject and move creation
  of operator factories outside of ExpressionCompiler
- Introduce PageProcessor and CursorProcessor and compile implementations
- Move cursor/page-specific compilers out of ExpressionCompiler and into PageProcessorCompiler/CursorProcessorCompiler
Add JMH benchmark for TPC-H query 1
Process partial pages if PageBuilder becomes full
Buffer bytecode output to avoid tearing
Use invokedynamic for generated toString method

This is to avoid constant pool issues due to large strings
Factor out duplicate defineClass implementations
Use convenience method for generating default constructor
Remove unused "compiler.new-bytecode-generator-enabled" config option
Add convenience methods to bytecode framework
Fix a bunch of warnings, and fix Logger to use the right class
Avoid generating dead bytecode
Improve aggregation framework

Input functions may now specify @NullablePosition on their input
parameters, if they need to accept null positions
Remove AggregationFunctionDefinition
Fix typo in stats computation
Fix intellij warnings
Support scalar functions with @Nullable arguments
Allow binding multiple event clients