Create PETSc VecNest from MixedDat in petsc_base
Allow accessing PETSc Mat blocks via [] index or iterator
Flatten mixed Args in LazyComputation init and eval

Dependencies for lazy evaluation need to be the constituent Dats /
Mats for mixed types, since a Dat can be part of more than one
MixedDat etc.
Make data for all components of a MixedDat read-only in ParLoop
Refactor host code gen: move itset loop body to separate template
Host code gen: Factor itset loop body into separate function
Give JITModule a mixed shape and call itset_body_loop that many times
Expand mixed maps when passing arguments to par_loop
Reference maps with their mixed block index in generated host code
Correctly figure out mixed shape
Add Arg._is_mixed_mat property
Unpack mixed matrix blocks from the par_loop mat argument and assemble into those
Determine the shape of the local iteration space per Arg

When building an arg, iterate the extents of its mixed shape and
build a triply nested tuple with the exents of the local iteration
space for each block in the mixed shape.
Use local iteration space of Args to determine ParLoop itspace

Add a block_shape attribute to IterationSpace and initialize it with
the local iteration space extents read from the list of Args.
Always call Arg constructor when creating Dat Arg

Resolves an issue where the Arg constructor was bypassed when creating
an Arg from a Dat which uses an IterationSpace.
Build correct IterationSpace extents for flattened Args
Iterate ParLoop itspace to generate loop over mixed space blocks

This requires moving the local tensor declaration into the loop to
declare a tensor of right size for each of the mixed space blocks.

The local tensor declaration and each access therefore need to be
suffixed by the loop indices.
Add arities property to (Mixed)Map and unit test for it
MixedSet.{core_size,size,exec_size,total_size} returns sum of Set sizes
Add unit test assembling a Mat over a mixed space.