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.