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...)
With respect to the complex types (even including taxonomy), I think we need to be *very* careful and thoughtful about how they are defined (both the "keys", such as "taxonomy", as well as the structure of the values). Changing the representation of either of these things will make versions of metadata incompatible between files.