LocalCasProxyInstance: Excessive memory usage in `FetchMissingBlobs` and `FetchTree`

FetchMissingBlobs and FetchTree (via fetchTreeMissingBlobs) call Client::downloadBlobs() without a custom WriteBlobCallback. This means that all fetched blobs are temporarily stored in memory at the same time in a Client::DownloadBlobsResult. FetchMissingBlobs and FetchTree can easily request gigabytes of data, resulting in excessive memory usage by buildbox-casd.

We should use a custom WriteBlobCallback that stores fetched blobs in CAS as they are received instead of accumulating them all in memory.

The custom WriteBlobCallback won't solve excessive memory usage with individual huge blobs, though, see buildbox-common#72

Originally reported by @willsalmon

Edited by Jürg Billeter