DataLoader extends Promise

This eliminates a bunch of code, but DataLoader is still (sloppily)
handling cancellation, which should be moved up to Future