Attempt at PartitionedGuidedImprovementAlgorithm.

In this implementation, the search space is split into separate and
independent partitions, based on the first Pareto point found.

This implementation works for any number of objectives. Single-objective
problems are special-cased, since partitioning doesn't make sense.

Tasks are submitted to a threadpool only if its dependencies have
completed. The search space is only split on the first Pareto point; the
subtasks will not recursively split their partitions.
Clean up whitespace