Adapt uses of Dat.vec{_ro}: now returns a context manager

This is due to a change in the PyOP2 API to accommodate scattering
arrays on MixedDats into a contiguous vector.
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