Implement lazy bilinear form assembly

When pre-assembling systems that contain boundary conditions it is legal
to do:

    A = assemble(a)
    for bc in bcs: bc.apply(A)
    solve(A, ...)

However, the way we apply boundary conditions to the bilinear form
requires that they are available when we assemble it.  To support the
above, we need to postpone assembling the form until the solve
call (when any boundary conditions must be known).

To do this, when assembling a bilinear form we now return an unassembled
Matrix object, with a assembly callback stashed on it.  When we need it,
we must now call Matrix.assemble().  If the Matrix has already been
assembled, this is a no-op.
Add more tests of preassembled Matrix boundary conditions
Make Matrix.M property force assembly

If we're looking at the op2.Mat through the public property, we probably
want some values in it, so force the assembly of the Matrix.
DTRT if a preassembled Matrix is reused with different bcs

If we preassemble a Matrix and then use it with some set of boundary
conditions, if we later reuse it with different boundary conditions,
force reassembly with the new boundary conditions.  This way, we get the
speed of preassembled things with the DWIMness of just using forms
everywhere.
Add __str__ and __repr__ methods on Matrix
Add more tests of Matrix behaviour

Check that assemble is actually doing things lazily.
Make remaining tests executable as python scripts

If run as python test_foo.py, import pytest and run the file.