Exit in MacPerl has been plaguing me quite a bit, but Matthias sat me down and explained some bits I didn't quite get, and I think I have a better, if still incomplete, handle on it.
So there were two problems with exiting as we were: some tasks were left in the queue (including, perhaps, some "exit" tasks), and things that needed to get killed off (like the sleep timer) were not, because SIGINT was not raised. So now, we just raise SIGINT, which handles things as they should be handled, for the Stop Script command. And we have a new function to clear out the async tasks in the queue when the script starts.
I realize some of this might not make much sense