Implement progress to NanAsyncWorker.

This builds on NanAsyncWorker by providing a NanAsyncProgressWorker which can dispatch progress information back to the originator.
I really dislike the idea of using the loop lock as a way to detect an error condition.  Considering the only time that mutex is locked is for the moment it takes to perform a swap of asyncdata_.  I don't think we would be gaining anything by checking the lock.  Note that the worker itself manages its own lifecycle, and does not trigger itself to be deleted until after the job completes, meaning that the other thread needs to be dead first anyways.