datafusion-distributed 4.0.0

Framework for enhancing Apache DataFusion with distributed capabilities
Documentation
# Upgrading from 3.0.0 to 4.0.0

This guide covers the source and behavioural changes merged after the
`v3.0.0` tag.

## 1. Introduction of PhysicalProtoConverterExtension to the DistributedCodec

Custom `PhysicalExtensionCodec` implementations must use the new
`&dyn PhysicalProtoConverterExtension` argument in both `try_encode` and
`try_decode` when encoding or decoding DataFusion
plans and expressions. See
[Distribute a custom execution plan](../source/user-guide/04-distribute-custom-plan.md)
for the complete signatures.

## 2. `NetworkBoundary::producer_head` now returns `Result`

Custom `NetworkBoundary` implementations may now return errors when
constructing producer heads.

```rust
fn producer_head(&self, consumer_tasks: usize) -> Result<ProducerHead> {
    Ok(ProducerHead::BroadcastExec {
        output_partitions: self.output_partitions * consumer_tasks,
    })
}
```