Implement reusable promises, Closes #5