Initial import

This is my first push of code to GitHub, made as a pull request for easier review
Another wrinkle is that there's a `.catch()` in `networkFirst()` that handles `fetchAndCache()` rejecting and returns a previously cached value in that situation. So you're forgoing the opportunity to display a valid cached response there if `fetchAndCache()` doesn't reject on HTTP errors.

I could see the argument about not rejecting on HTTP 404, and maybe some of the other 4xx code as well. I think you should reject on, at the very least, `response.status >= 500`.