fix void promises and use unique_lock instead of directly locking task mutex for future condition variable support