Add ViFold object to track data about a fold.

Currently it has fields for range, open/closed status, parent,
and children.
Update ViDocument to use ViFold for tracking folds.

When creating a new fold for a given range, we merge folds
that overlap the new fold at the front and/or back. Still no
hierarchy, so we obliterate folds in between. More to come
on that front.
Implement ViFold's addChild: and removeChild:.

We use a mutable set to manage this, though the property
is exposed as a simple set to consumers.
Add depth property to ViFold.
Add two helper functions, addChildToFold and addTopmostParentToFold.

addChildToFold adds a given child fold to its parent.
addTopmostParent adds the topmost parent of a given child
fold to a given parent fold.
Add parent fold to ViFold description.
Implement nested fold management in ViDocument's createFoldForRange:.

Folds are appropriately updated given a new range to
create parents and children as necessary.