Add tests that solvers are correctly gc'd
Only remove snes options when the solver is GC'd

This is necessary so that the options propagate into the sub-solves
correctly (by the time the options setting was called, the options the
user had passed in were no longer in the options database).

Since the snes object holds a reference to the solver it lives
inside (via the form_function/form_jacobian callbacks) we must destroy
it explicitly at the end of the solve_varproblem call.
Add trailing underscore to SNES options prefix

This makes sub-object prefixes nicer to read.
Set up fieldsplit ISes on solver

When assembling a mixed system, we probably want to use a
"physics-based" preconditioner such as a Schur complement approach.
Inform the preconditioner in the solver of how to split the monolithic
matrix into blocks, allowing construction of these by passing
appropriate solver options.
Precondition mixed Helmholtz problem with Schur complement

Now that the fieldsplit is set up correctly, we can use a Schur
complement preconditioning approach for the mixed system, rather than no
preconditioner at all.
Revert "Make snes solve into a temporary vector"

This reverts commit c1bd69359553ecd76b264073cdbca2985f039355.

This doesn't actually appear to be necessary, the nested context
managers do actually work.