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.
allow to remove all tags, update tests and docs