Refactor Promise using a GCD queue

Inspired by the description of maxpow4h/swiftz#37, but with a completely different implementation, based around using the queue as a blocking and notifying mechanism.