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.
I've been thinking about your idea. Isn't that rather like having two cursors where advancing one cursor resets the inner one? So an outer cursor would walk over an array property of some underlying entity while an inner (dependent) cursor would allow walking the elements of the array.

To make that sensible, it might be of use to have a next() method on cursors that just advances forward in order to avoid having to allocate the actual array value for situations where the inner cursor is used to access it (e.g. iterating rel types or label ids).