Force explicit work completion

Before, workComplete() had to be called by descendants of AbstractWorker; otherwise the worker hung around. But it's easy to forget to call workComplete, and turn into a zombie by accident.

By making AbstractWorker.doWork return an enumeration, the descendants of AbstractWorker need to be explicit about whether work is complete, or work is in progress and the worker should continue to live.