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...)
i think it makes for clearer code in the future to say self.metadata(axis='sample') in these situations even though sample is the default.  other devs can weigh in their opinions though