Tags refactor part 1

This is the first part of a refactor of the names package to introduce a Tag interface type, and real types that represent different types of Tag implementations.
Personally I have taken to putting the struct definition inside the for loop for the tests now.  Not a request to change, just I think this is what more people are doing now - informational only.