This function is used to split a grid search up into equal sized blocks, taking constraints into
account, specifically for the purpose of running each block on a slave in a cluster or thread on a
multi-core system. However the blocks returned were not from the grid points trimmed after checking
constraints, but rather the original non-constrained points. Hence if constraints eliminated
points, those points might be used but points at the end of the grid would be dropped instead.