Multiplicity on set

The `dim` i.e. the shape of the data associated with each element of a `Set` was previously a property of the `Dat`. You could declare a scalar-valued `Dat` and a vector-valued `Dat` on the same `Set`. A function space (in the FEM sense) was therefore not fully defined by a `Set` alone but required information from a `Dat` defined on that `Set`. This is conceptually awkward and is prone to inconsistencies. Therefore we migrate `dim` from `Dat` to `Set` to make a `Set` fully define a function space.

[Buildbot pass](http://buildbot-ocean.ese.ic.ac.uk:8080/builders/pyop2-testing/builds/231)