Fix deadlock in Promise.await()

Because observation must synchronize on the signal object, our
NSCondition nestled in here could deadlock with the signal’s private
GCD queue.

Use a dispatch semaphore for notifying instead, since we shouldn’t need
to grab a mutex just to notify the awaiter that a value was received.