Rewrite HTTP caching tests as integration tests

Total runtime drops from ~21s to ~7s
Don't cache error responses (status >= 400)