Allow when/delay to be externally resolved

- returns a full deferred instead of a promise
- clears the timeout when resolved/rejected