Compute traversals, also h5py, also repr

Sorry for the giant PR

I'm trying to make h5py / out-of-core interactions feel more intuitive.  There are several mechanisms for this including the following:

1.  Just shove it into memory
2.  Oh, there is a slicing operation somewhere in here?  Push that down the tree so that it happens first
3.  Oh, you're doing a reduction?  Lets chunk and split.

These different mechanisms depend on different parts of what is rapidly becoming a more well thought out (and unfortunately also more complex) compilation pipeline.  Things like `pre_compute` and `optimize` are becoming more well thought out, are being applied in more cases, and so are becoming more powerful.