Make matrix assembly a user-facing operation

The user may call multiple par_loops to insert into the same matrix, and
will only want to actually assemble it after the last one has
completed.  Add a Mat.assemble() call which queues up (as a lazy
execution) the matrix assembly callback to allow this.
Add note on matrix assembly to concepts doc
Merge pull request #352 from OP2/matrix_assemble

User must now explicitly call Mat.assemble() after a par_loop before
looking at it.
Caching: return early if we're not meant to cache object

If the key for the object is None, we're not going to store it, so make
a new object and return immediately, rather than looking in the cache
for it.
Make disk cache MPI safe

Rather than every process looking in the disk cache, and potentially
storing a new object there, read on rank zero and broadcast.  This fixes
a potential race condition where one process would read while another
was writing.
Merge pull request #354 from OP2/fix/disk_cache

Make disk caching MPI safe.  Only hit the disk on rank zero and
broadcast the results.
A couple of consequential fixes

* It turns out lazy sometimes evaluates the CoW copy early. That's fine, but we have to take that into account.
* Touching .values or .array needs to force matrix assembly.
Merge pull request #356 from OP2/further_cache_fixes

A couple of consequential fixes
MixedDataSet.cdim returns sum instead of tuple
Check vector/scalar field property on Mat block
Compute mixed block offset on the fly instead of in Arg
Properly compute block shapes for mixed + flattened Arg
Allow flattened mixed Dat and Mat Args
Fixup incorrect uses of cdim in host code gen
Fix host code gen for staging in mixed flattened vectors
Fix extrusion offset computation for mixed flattened
Refactor c_map_init: fit for mixed + flattened
Refactor c_add_offset_map: fit for mixed + flattened
Eliminate code duplication in c_add_offset_flatten
Eliminate code duplication in c_map_decl_itspace