Prepare for asynchronous execution in doLoad(), doResolve(), doUnload()

* add some exceptions (ArtifactException, WrongStateException)
* add WillFinishLaterError
* make ArtifactJob.run() return Result enum (DONE, FAIL or STALL)
* add ArtifactJobCallback and support for it in JobContext and
respective do*() methods
* add SafeFuture
* make pulse() remove the artifact after LocateJob failed
* remove CompoundJob
* implement default ArtifactState-based decision making in the default
jobs
*