[#75962418] Write non-HTML content to disk

This adds support for writing the following file types to disk:
- ATOM
- CSV
- DOCX
- ICS
- JSON
- ODP
- ODS
- ODT
- PDF
- XLS
- XLSX

Created a new `http_crawler.CrawlerResponse` object that will hold the body and headers for the HTTP response. It then provides some helper methods around `Content-Type` values that we support that are used elsewhere in the workflow for the function `WriteItemToDisk`.
I'm not sure we should requeue if the Content-Type couldn't be determined as this would indicate that the pages has been malformed (which I'd hope would be extremely rare for a HTTP 200 response). I think it'd be better to reject the message without requeueing; it will always be retried once the TTLHashSet expiry time passes.