Currently, the controller does too much computing for scatter/gather of data. This overhead should probably be lowered with much of this work happening on the client, so we respect the controller as purely a data broker between client and engines.
Moving these responsibilities to the client will simplify the controller, lowering the likelihood of it blocking because of being busy.
The current model also makes large objects live entirely in the controller for scattering, while a partitioned approach will also lower this memory pressure.