Fix HiveClient representation of Double in Partition keys
Allow PredicatePushDown optimizer to handle NullLiteral from nullInputEvaluator
Add support for range predicate pushdowns

This work is a complete refactor of how we generate Partitions in the planning/execution phases.
Instead of generating Partitions after planning, we now integrate the generation directly
into the optimization planning phase so that we can iterate our plan based on data returned
by the Partitions that we discover. This not only provides a number of opportunities for
optimization, but also significantly simplifies the amount of cross-talk between the
split generation and the planning phases. As a result of these changes, it makes
it much easier to build native range predicate push downs.