Handle nondeterminism in async goals

A goal passed to async/2 can produce zero or more solutions.  Those
solutions and their choicepoints are correctly communicated back to the
calling thread when it calls await/1.
Rethrow exceptions discovered in a worker thread
Reclaim worker threads when they're done

Each call to async/2 creates a worker thread.  All resources from that
thread should be reclaimed when the worker is finished.  The old code
left these threads lying around indefinitely.  Marking them as detached
allows SWI Prolog to clean them up for us.