The code here is inspired by Brandon Simmons' zippo package, but uses
a different approach to represent the Zipper that makes the whole thing
look like his breadcrumb trail, and can move side-to-side through
traversals.

This is particularly powerful when compiled with plate,
uniplate or biplate for walking down into
self-similar children in syntax trees and other structures.

Given keys in ascending order you can jump directly to a given key with
moveTo. When used with traversals for balanced
tree-like structures such as an IntMap or Map,
searching for a key with moveTo can be done in logarithmic time.

The combinators in this module provide lot of things you can do to the
Zipper while you have it open.

Note that a value of type h :> s :> a doesn't actually contain a value
of type h :> s -- as we descend into a level, the previous level is
unpacked and stored in Coil form. Only one value of type _ :> _ exists
at any particular time for any particular Zipper.

This allows you to safely tugleftward or tugrightward
multiple times on a Zipper, moving multiple steps in a given direction
and stopping at the last place you couldn't move from. This lets you safely
move a Zipper, because it will stop at either end.

Restore ourselves to a location near our previously recorded position.

When moving left to right through a Traversal, if this will clamp at each
level to the range 0 <= k <teeth, so the only failures will occur
when one of the sequence of downward traversals find no targets.