Refactoring preconditions

* Checking date and etag separately, to provide appropriate error messages for clients
* Folding in cache control headers, so behavior is consistent