New tag framework

New tag framework described here: https://indico.cern.ch/event/343171/session/16/contribution/32/material/slides/0.pdf

The segfault described in the meeting above was due to existing code that had not crashed before, which is why it was a bit unpredictable.  It turns out that PhotonIdUtils::~PhotonIdUtils deleted 3 pointers, which by construction always pointed to only 2 objects.  Thus something was getting double-deleted, which can do bad things to memory.  This pull request includes a fix for this using std::shared_ptr, and everything now works.