Hdf5 metadata change

Fixes #463

Additionally:
- `observation_metadata` and `sample_metadata` are now private, and the function `metadata` has been updated so if `id is None` it will return the metadata along that axis.
- `group_metadata` has been added, with and `axis` parameter
- Some code clean-up, removing unused variables/imports and code duplication

@wasade it would be great if you can review.

`sample_ids` and `observation_ids` should became private and create a function `ids` that accept an `axis` parameter, for consistency with other methods. I was thinking on including that change here to, but it would be a lot of changes in a single PR. I can work on another PR once this is merged (to avoid merge conflict hell...)
When we discussed this at Flagstaff, we were going to associate types with data elements, so that we would know how to parse them.  However, to do this we would have to predefine a list of types (a controlled vocabulary describing the types that we know how to work with).  We were envisioning the types as either atomic datatypes (str, int, etc.) or structures with a predefined format (e.g., 'taxonomy' would be a type, and we would require the value to be of a specific format).  This isn't *awesome*, I don't know of a better way, unfortunately...