* Implement asynchronous alternatives to md_download and
md_download_manifest as md_download_begin, md_download_end, and md_download_manifest_begin,
md_download_manifest_end.  Refactor md_download and md_download_manifest
to use the asynchronous methods instead.
* Fix a race condition between the download thread waking up the
download context's parent download set and the client thread freeing the
download context.  Sometimes, the client could free the download set
after the downloader finalized the download context, but before it tried
to wake up the download set, causing the downloader to access invalid
memory.
* It is no longer considered an error if the caller does not supply
either a closure or a cache connector function to md_download_manifest.
If one or both are absent, the method will directly download the
manifest; if both are present, the method will connect to the CDN(s) and
try downloading that way.
Better debugging information for when the AG decides to send the client
a 503 because it needs to reversion a file.
Use the new md_download_manifest() method
Use the fs_entry_revalidate_once() method correctly.
Add explicit curly braces
Refactor ms-client.cpp to use the libsyndicate download framework for
uploading/downloading metadata requests and responses to the MS.  This
removes the need for the ms_read, ms_write, and ms_view long-lived curl
handles, and makes possible truly multi-threaded MS access.  This paves
the way to better mass-update and batch-update logic in the AG.
Refactor the UG to use libsyndicate/cache.cpp, which is based off of
UG/cache.cpp (which will be removed).