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