Set maximum read and write retries, as well as a timeout between them,
for when the UG goes to read data from another gateway.  This is part of
addressing issue #81.
In the FREE_LIST macro, check that the list is not NULL first.
Clean up dead code in syndicatefs.cpp
Have the UG try read requests again if they fail, up to a configurable number
of times.  This is part of addressing issue #81.  Also, respond to an
HTTP 503 as needing to try a read again (the AG will send 503 if it is
in the process of generating data, but cannot serve it yet).
Have the AG multiplex signal handling among drivers.  Drivers can use
the AG driver API to register a signal handler, and the AG will
serialize signals and dispatch them to multiple signal handlers for the
same signal.  This means drivers (when properly written) won't mess up
each other or the AG when it comes to dealing with signals.
Small refactorings in the AG:
* have AG_map_info track the request path and query string.
* have the XML parser properly initialize AG_map_info.
* install the multiplexed AG signal handler on start-up, and uninstall
it on shutdown.
* Atomically generate an updated AG_map_info to pass into the driver
when a dataset gets reversioned.
* Make internal API calls consistent with one another.
Don't eagerly reversion data.  Only do it on request.
Bring disk driver API up to date.
WIP: refactor shell driver to use the new driver API.
* no longer depends on inotify.
* will serve partial data and manifests for partial data.
* will ask the AG to reversion its data once the shell process
generating it completes, ensuring that UGs can access data early
if desired without worrying also about cache consistency.

This driver needs testing.
Remove now-unused shell-ctx.h header from the shell driver.