Add CancelablePromiseInterface and implementation to allow promises to cancel