Introduce #traverse() in the Kernel API

Add a first traverse primitive to the kernel api, which uses the
cursor/register spec to define its signature. This first primitive is capable
of traversing a single hop from one source node, and filters by reltype and
direction.

This commit contains:

- A revised Cursor, no longer inheriting from IOCursor as the two perform
  different jobs.
- Register implementations needed for this first traverse primitive.
- A complete "augment" cursor that can overlay local tx state on top of another
  traverse cursor.
- A temporary implementation of a store traverse cursor which simply piggybacks
  on existing listRels and visitRel mechanisms in the cache layer.

Next steps:

- Refactor the store format into stand-alone classes, separate from the stores
- Implement a store traverse cursor that uses those format classes directly,
  bypassing the cache.
Would it make sense to have `boolean hasMore()`, and have `Write#write` return boolean so that one can implement a register capable of writing/reading more than one value? It could be a nice optimization to avoid going through "the call stack" for every value. We could have registers that were fixed size arrays with a reader/writer cursor into them. So the code that writes into a register can keep writing as long as `Write#write` returns `true`, if it so feels like, and even if there's code just writing one