Sharded data sources

Adds an `AggregatingDataSource`, which knows how to speak the Firefly data server protocol to other data servers to aggregate that paths serviced by multiple data sources into one 'logical' data source. This is useful for, among other things, sharding one data source into a few different data sources which service a disjoint set of statistics while still presenting all of the stats in a unified view as a single data source.