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...)
For taxonomy, you could just do a (n, 7) dataset and wouldn't need an attribute, with the empty string or something for missing taxon names. This means we can't have jagged data, which we potentially get with KEGG Pathways, which then suggests that we don't use the full dataset. It really just depends on the goals of what we're doing here. I thought we were getting rid of JSON, and making it easy to index into metadata via the HDF5 API. If so, then we should figure out something smart here