fix(fields): handle nil receiver on Equals() methods

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
feat: rename validation methods for clarity and add helper

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
fix: ensure archive DescendantsOf does not return the root

Previously DescendantsOf returned the requested node's id as
one of its own descendants. This was not intended.

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
feat: gracefully handle corrupt nodes in groves

The grove type now allows applications to provide a hook that will
be invoked when a corrupt node is discovered. Additionally, the grove
type now attempts to recover from corrupt nodes by deleting them
fix(grove): ensure write errors are caught on node create
fix: update old branch name references
deps: update to latest protonmail crypto
feat(grove): support removing subtrees
wip(grove): implement child cache entry removal
wip(store): initial work on subtree removal
feat(twig): reject values with null bytes in Set
fix(fields): guard against incorrect qualified type lengths
tests(fields): regression test to catch qualifieds with bad lengths
tests: update errNode to new Node interface
Add author and metadata getters to Node interface Validate metadata in shallow node validation
chore: remove unnecessary error handler
Use twig key parser
Add metadata handling

Add twig read/write functionality to node creation

Address feedback

Fix struct accessibility

Address some feedback

Use valid key string

Add Contains and Get functions to sprig data

Use <key>/<version> to add metadata
Update docs

Do propper string splitting and update sanity check
feat: suppress extra archive notifications

Previously, archive.Add-ing a node would *always* send a
notification to all subscribers, but this behavior wasn't
relied upon anywhere. It's much more useful if the notification
is only sent when the node is not already in the archive, so
this commit changes the behavior to enforce that.