I did it both ways - IPython and joblib - since IPython was crashing after running for a few hundred iterations.  Turns out that IPython stores _all_ intermediate results so that they can be used by other clients - this is not needed here and this isn't really well described in any IPython parallel example.

This really should be refactored so that the parallel loop is operating over all simulations with the same T.  This would allow it to scale to very large clusters.  As it stands now, there wouldn't be many gains with more than 8 CPUs since the runtime for the largest T case would become a binding constraint.