Asyncprogress

Rebased and fixed. Replaces #175 and #181. Closes #169.
Maybe lock and unlock the mutex before destroying it.  If another thread has the lock, then this thread will block (giving off a clear signal that something is wrong) instead of entering undefined behavior territory.  Something like this would work as well:

```c++
if (uv_mutex_trylock(&async_lock)) abort();
uv_mutex_unlock(&async_lock);
uv_mutex_destroy(&async_lock);
```


Libuv will abort when `pthread_mutex_destroy()` returns EBUSY but that only happens when it's compiled with `!defined(NDEBUG) && defined(PTHREAD_MUTEX_ERRORCHECK)` and even then, pthreads does not guarantee that all error conditions are caught.