threaded shutdown seems to be much healthier when all the threads are given a cancel order first. this doesn't make anything stop or pause, and we zoom through the list cancelling them all. they're then free to exit at will. and when we start waiting for them in the amorph reset, they're mostly already done, so the shutdown is pretty much all threads down in parallel, instead of the sequential shutdown we had been doing (which was also fraught with potential error, apparently, from inconsistent ordering of thread shutdowns and object shutdowns and such).