Move execute callback out of lock.

Holding the lock during execution callback would create a deadlock during
assignment (from within the callback).  The correct way is to move execute
the functor without holding the lock (by moving it on the stack prior to
execution).

While here, reset the callback functor once the promise becomes ready.
This is not strictly required, but helps with releasing resources early.