store tags in data table in addition to tags table

When tagging data, we now also write the tags to the data table so that when we
query the data table directly, we can load all of the tags for the data.

This commit adds support for numeric data. The next commit will add support for
availability data.

There is an additional schema change included. A tag description column has
been added so that users can supply an optional description. Tags in the data
table are being stored as a map of tag_name --> description. If there is no
description, we store the empty string. There are a couple reasons for this
approach. First, collections do not allow nulls. I considered a UDT which
would allow nulls, but that does not hold up in one scenario. Suppose I have
already tagged some data point with tag T1 with no description. If I later
re-apply T1 with a description, I believe that the UDT appraoch would result
in a second tag entry. The map with the empty string gives the expected
semantics of overwriting T1 with the description included.