Refactoring taggable, added retag method.

Refactors Taggable to make input sanitisation code cleaner and reusable.
Adds a method 'retag' which adds tags not already defined and removes tags that are currently defined but not passed in, effectively replacing the existing tag list with the one passed in.