New file where I'm playing around with more elegant possible designs for the library. What I've discovered is that the composition of two Distributive Comonads is itself a Comonad.
Added some preliminary code showing how this library design eliminates the n^2 instance declaration problem, as well as making more elegant (and thoroughly commenting) the magical Comonad instance for the Compose of two Distributive Comonads -- it turns out only the inner one actually has to be Distributive.
Use FlexibleInstances to prevent weirdness from typechecking -- that is, no instance is provided for the ZipperN typeclasses for anything other than outer-composed nested zippers. That is to say, you can manipulate anything of the form (Compose (Compose ... (Compose Z Z) Z ... Z) Z), but nothing of the form (Compose Z (Compose Z ... (Compose Z Z) ... )) or friends. This means that the behavior is predictable and limited only to the types we care about.