Abstract cache expiration timer mecanism
Nicify saveImageInCache

Move the asynchronisity up to the caller and remove one level of indentation
Unspaghettify the call graph

fetchImageFromServer() now doesn't return anything useful,
it just updates the cache and we always get (meta)data with
fetchImageFromCache(). This will allow to do more fancy stuff
with the headers from the upstream server without making the
call graph even worse.

Also, previously, when fetching an outdated image, we would still
try to get it from the cache while updating it asynchronously.
Now, we update the cache before returning. This means requests that
trigger a cache miss can be a bit slower but at least they get the
correct answer now.
Try to get HTTP 304 from upstream server

Keep track of the ETag returned from upstream server and mention it
in If-None-Match whenever refreshing the cache. This allows the upstream
server to return a 304 without body instead of a 200 with the file we
already have.

Notice RFC2616 section 13.3.4 says if we are going to try to play it
smart we MUST use ETag and we SHOULD use Last-Modified. So, let's keep
it simple and stick to just ETag for now.
Return Last-Modified time conform to RFC2616

Section 3.3.1 says it MUST be GMT.