Refactor datShape

So that we can get the upper and lower bounds of the dataspace.
Allow GetBounds to report whether it is a slice/cell

Otherwise you can't tell if GetBounds is reporting the full extent
or the extent of a subset.
EncodeSubscript can now be told whether to look for cells

So even if upper[] is present, a cell (2,3) representation will
be reported if upper==lower in all dimensions.
Always write dimensionality of group

even if it is a array structure (which is scalar by definition).
Fix logic of status check

Otherwise we get additional irrelevant error messages.
Improve error messages