A rejected promise has a reason
Add fulfillment callbacks
Add rejection callbacks
Ensure callbacks are optional
Call fulfillment callbacks when promise is fulfilled