Trees have to be distributed among cluster nodes "statically", prior to executing a node. (Dynamically would be even better, but that's far too complicated for now). However:
* Optimal clustering depends on set of solvables (may be different for different solve jobs)
* So it's too limiting to fix it at creation time.
* So we need to be able to re-configure a given tree in between requests, thus moving tree nodes between machines.
* This is easy enough to implement: toBlock/fromBlock/reinit, and locally replace it with an MPI stub.
* How to specify: only specify cluster locations for a few intermediate nodes. Then, resolve as follows:
- Say the root node is at machine A. Start at root node, recurse into all children and assign them to machine A, until we hit one with machine B specified. The entire subtree rooted at that node is then recursively assigned to B, until we hit a different specification again. In this way the entire tree may be segmented among machines in the cluster, with only the key "crossover" nodes specified.
