Baisc query scheduling implementation

This PR provides the first cut of query scheduling. The new DistributedDriver is used to build queries over tables from multiple drivers (all based on RelationalProfile). Queries are decomposed into parts for the individual drivers (which are compiled and executed in the usual way) and the remaining computation for joining the data is performed at the client side with the query interpreter. The API needs to be fleshed out in a future version (e.g. we could use this for driver-independent data access, even if only a single other driver is ever used) and the execution strategy improved (e.g. run sub-queries concurrently and use parameterized sub-queries).

Review by @cvogt