Tags stored as objects

This is a very minimalist view of tags, and can be used for diffs
and other things starting with this commit, but it doesn't yet
include any of the metadata that you would expect to be part of
a tag.