Setup aggregate processing in TwitterAggregateManager.

Setup tracking of aggregates and their relationships in the query
trees. Use this to dispatch processing of aggregates to worker
threads, looking only at aggregates that have been marked ready for
processing because they have no dirty children left.
Add a few simple tests for Transfer::URL.
Add query string and fragment ID support to Transfer::URL.
Properly handle stats for failed HTTP requests.

Fix HttpTransferHandler to not try to add to the bytesTransferred if
it hits an error. This was causing a crash because it tried to use the
response, but it wasn't a valid pointer in the case of failure.
Add basic aggregate processing to TwitterAggregateManager.

When aggregates are processed, download and parse all their children's
information. Use a cache to avoid downloading more than
necessary. Then, as a temporary type of aggregate, create a subset of
the tweet data, serialize the JSON, and upload it to a server
(currently using a simple HTTP request instead of the OAuth approach
because that makes the storage implementation simpler). Finally, with
the new data in place, construct and set a new URL for the aggregate,
allowing processing of parents to proceed.