text: Title: sanic.response.file() could work a bit harder wrt caching
  Body: I'm using `file()` to send static files from my application.
  
  Initially, my code was the obvious, e.g.:
  
  ```python
  @app.get("/images/<name>")
  async def image(request, name):
      path = Path(os.getcwd()) / "images" / name
      return await file(path)
  ```
  
  but I noticed that the images were fetched by the browser on each page view.
  
  Digging in, I found the code or `file()` didn't deal with modification time of the files, and provided very little support for caching.
  
  As a quick workaround, I wrote a function similar to this:
  
  ```python
  async def send_file(path, max_age):
      stat = os.stat(path)
      size = stat.st_size
      mtime = stat.st_mtime
      headers = {
          "last-modified": str(mtime),
          "content-length": str(size),
          "cache-control": f"max-age={max_age}",
      }
      return await file(path, headers=headers)
  ```
  
  but that's just a small part of what would be useful.
  
  I believe functionalities and code similar to this: <https://github.com/pallets/werkzeug/blob/main/src/werkzeug/utils.py#L329> would be useful, specially to support common use case around caching.
  