Interesting. I got it working by moving `newSeq(threads, 4)` into `cycle()`. I guess once a thread has finished running, simply releasing the `Thread[]` object to GC is the way to destroy it. They are apparently not re-usable.
I haven't been able to cause fragmentation after thread destruction, which is good. But I don't yet know the performance penalty of continually creating new threads, and whether it's justified by the savings in reduced fragmentation...
