feature(tag): reimplement Tag class for simplefied system

stores tag both as a string and as an ordered array, for manipulation
by other methods. Added a series of methods to retrieve different sections
of the tag and it's children
refactor(record-tag): begin to use new Tag class to deal with storing
tags in record.

Replaced functions with Tag methods
feature(tags): add getTree method to produce an array of tree objects with the following properties:

{
    tag:String - tag name
    count:Integer - number of times tagged
    children:Array<tagTree> - children of tag
    childCount:Integer - number of children
    topLevel:Boolean - has this been used as a top-level tag?
}

the array contains every single tag, including children - due to
the nature of constructing with javascript objects, this makes it
trivial to add children to objects and still be able to edit them,
as objects are treated as a reference rather than a value.
feature(api): add two methods for recieving tag tree information

/api/tag/tree retrieves the entire array raw, as recieved from the
getTree function

/api/tag/top only retrieves those tags with the topLevel property set
to true. This still contains every tag, but here the only way to
access a tags children is through its .children property
fix(api): return string tags, rather than tag Objects
fix(tag): return tags as strings rather than objects for Tags.getAllAfter
Merge pull request #17 from sjmarshy/feat/api/tree

Feat/api/tree