Add MixedFunctionSpace class to core_types
Product of FunctionSpaces yields MixedFunctionSpace
Interpolating an Expression on a MixedFunctionSpace

Refactor interpolate to walk the components of a FunctionSpace and
interpolate the given Expression on each one of them.
Test assembly of expressions on MixedFunctionSpaces
Refactor test_assemble fixtures into common module
Refactor test_expression to use common fixtures
Make a FunctionSpace indexable by 0
Support assigning expressions to MixedFunctionSpaces
Extend expression tests to MixedFunctionSpaces
Test assembly on components of MixedFunctionSpaces
Add {Mixed,Vector}FunctionSpace.cdim property
Add {Test,Trial}Functions to ulf_expr
Expression code length needs to match cdim of FunctionSpace
Test many more expressions, including mixed vector fs
tests: Refactor more fixtures into common module
Test assembly on more function spaces

MixedFunctionSpaces from a FunctionSpace and a VectorFunctionSpace
are not supported yet
Add a mixed Helmholtz MMS test
Parametrize mixed Helmholtz: RT1+DG0, BDM1+DG0, BDFM2+DG1
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.