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.