We should consider having the default_sweep_callback and default_region_callback be called by iterating the SweepIterator and RegionIterator rather than having sweep_solve be responsible for calling these. (There is already a comment in the code suggesting this.) If we did this, then sweep_solve would just be some loops and little else but that's fine.
A key benefit would be that one could use the iterators outside of the sweep_solve setup and still benefit from the callbacks associated to a problem type and/or have a built-in callback system.