Initial import

This is my first push of code to GitHub, made as a pull request for easier review
Discussed with @jakearchibald  to get a good overview of how `clone()` actually works, and we agreed that it doesn't usually matter which way you do it. The only important thing is that the `clone()` happens before the `Request` or `Response` is used. In this case the order of async operations is such that the response will be returned and potentially used before the `cache.put()` call, so it cannot be done there.