async image download + cache to disk