refactor bookkeeping of valid joins in the presence of revisions that throw an exception

 - make sure that the finally clause removes the failing revision from the joinSet
 - test for empty revisions and failing revisions
add a helper method to execute blocking code in revision executor pool

this is adapted from the Scala standard library, to ensure that a thunk that may block, and that is running in a fork join worker thread, is managed by the ManagedBlocker interface.
a port of the concurrent revisions Asteroids game

ported from the Haskell version in the Prettier Concurrency paper
add basic mechanism to abandon a revision

This begs the question of how to clean up nested revisions…