add uniqueTag and tags for all adjuncts, use them when determining duplicates

Not sure I follow. I thought one of the points of `TypeToken` is that it has the generics information at runtime (i.e. it is not lost through type erasure). However, just casting `TypeToken.of(Map.class)` means it will not have the generics at runtime. We need to declare a sub-class of `TypeToken` in order to preserve the generics - i.e. TypeToken.of()
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/reflect/TypeToken.html

It feels like these utilities have a place (e.g. in removing compile warnings about casting and missing generics etc), but do we subsequently rely on the `TypeToken` still having the generics at runtime?