Introduce MetricName type to encapsulate more information about metrics.

This is a large refactoring meant to change the way metric names are
represented to better suit a wide variety of backends.

Quite a few metric backend systems are starting to use a general concept of
'tags' which is a step back from having too encode information in the (string)
names of the metrics*.

* KairosDB (http://code.google.com/p/kairosdb/), OpenTSDB
(http://opentsdb.net/overview.html)

Tags are meant to allow for natural grouping of similar timeseries allowing for
the ability to easily correlate freely between the timeseries that incorporate
them.

For example, take the following two timeseries.

* example.com.interface.traffic.eth0.in
* example.com.interface.traffic.eth0.out

Using tags, these would be represented as;

* interface.traffic {host=example.com, interface=eth0, direction=in}
* interface.traffic {host=example.com, interface=eth0, direction=out}