Add template type as trait to Space
Re-implement Boundary operator wrapper

Now uses a boost::variant. This is a safer way to deal with the multiple types
that (with respect to basis and result type) the operators can have. Basically,
static polymorphism is dealt with at the C++ level, rather than via casting in
cython. Compiling is slower (template instantiation), but compute should be
quite similar, if not faster.
Add comparison operator to spaces
Re-implement context wrappers

Context now uses new boost::variant spaces and boundary operators.