On edison, it's OK to have 500 signals being processed together; this seems to be sufficient to reduce waste significantly.  (Might need to scale it back significantly for hopper/SLAC.)
There are a large number of events which display poor convergence properties; all of them seem to have close-in-time u-wire signals.  Enlarge the cutoff for merging u-wire signals to deal with those cases.
Make the edison build script just a little more static, by linking statically to EXOAnalysis and a few other libraries pulled in by EXOAnalysis.  Should be straightforward to adapt to hopper; not sure if it's worth it at SLAC.
Add the non-default option to restart the solver after some number of iterations.
Go ahead and do restarts after a conservative 500 iterations.  At least at that point we can be fairly confident we're not converging well.
Do restarts after 100 iterations by default -- this *dramatically* improves the stability of the solver for aggressive thresholds.  (500 iterations was found to be too many; some events were still diverging.)
Count total iterations, and give up (with a message) after 2000.  This should ensure all jobs finish even if not all of the events are accepted.  I'll need to revisit why those particular events are so difficult to make converge.
EXOErrorLogger is not thread-safe -- replace all use of it with simple cout calls, and exit where appropriate.
Use the C interface to MPI.  Make sure MPI_Finalize doesn't interfere with the destruction of other function-static objects (like SafeStopwatches).