Add in memory tag and metastore index

## Overview

This PR adds an in memory metastore and tag index. It should be treated like a write through cache for the metastore. Whenever the metastore gets updated the index should. The index is loaded completely into memory on server load.

It will provide quick lookups for measurements, series, and filtering those based on tags and regexes.

For all the `LIST MEASUREMENTS`, `LIST SERIES`, `LIST TAG KEYS`, and `LIST TAG VALUES` queries, this index should provide everything needed to answer them. Unless they have a time filter, in which case we'll have to do some other stuff later.

The query processor should be able to use this to walk the AST of the where clause to get a set of series IDs that need to be queried. It can then use those to create MR jobs to get everything done.
I haven't fully reviewed this code, but it occurs to me -- it you added the `Measurement` to the `Series` struct, perhaps you wouldn't need this map? To get a `Measurement` from a Series ID, could you then just do:
```
measurement := series[id].Measurement
```
1 less map? This assumes you have access to Measurement when creating the Series (I don't see why not).