Correct error checking for Expression interpolation

Previously we were first checking whether the expression rank and
shape matches that of the function space. This was causing the wrong
error message for spaces that don't support point evaluation and
therefore one needs to use projection instead.

We initially make sure that we have an expression with a value for
each component in the value shape for each function space.
DirichletBC constructor correctly deals with Expressions

Previously we only supported literal constants or Functions as
boundary expressions. Add support for Expressions, which are either
interpolated or projected onto the function space, depending on
whether or not it supports pointwise evaluation.
Reconstruct products via the * operator in expression splitter

Reconstructing ufl.algebra.Product will fail if one of the operands
has a non-empty shape i.e. is e.g. a coefficient on a vector-valued
function space such as BDM.
Minor clean up of boundary extraction
Support lists of markers in facet subsets and DirichletBC

Build a cache of marker ids -> subsets for any given iterable of
markers as they are requested.
Zero rows in all diagonal blocks of a MatNest
Correctly apply BCs on subspaces

If a DirichletBC is defined on a subspace of a mixed function space,
make sure we only apply to the appropriate subspace of the Function.