Optimize partition pruning for Hive client

- replace usage of Warehouse.makeSpecFromName with a more efficient implementation
- build filters based on all partition keys, even if they are missing and call
  getPartitionNamesByParts. Use empty string as placeholder for missing filters
- short-circuit parsing partition key values and creating partition objects if
  we can determine the partition doesn't match the predicate

This results in a speedup in planning time for a table with 500k partitions from 19s to 150ms.
add a comment on what this is doing and that sharing the loop is a big perf win