- fixing incorrect assertion and related function name
- MPI_comm_split is not pure
- simplifying/standardizing permutation in all_gather
---------
Co-authored-by: Rolf Morel <rolfmorel@gmail.com>
Before trying to partition a block or operation, check that it is fully
annotated with `shard.shard` ops. This gives useful error messages
instead of random errors later on.
Allow implicit conversion from `TypedValue<B>` to `TypedValue<A>` if `B`
is assignable to `A`.
Example:
```c++
TypedValue<MemRefType> val;
TypedValue<ShapedType> shapedVal = val; // this is now valid
```