In order for per-FormatterStep equality checking to work, we have to explicitly capture all state.  Doing that is expensive, so it's important for it to happen lazily, so that a configuration that doesn't actually use a FormatterStep doesn't have to pay the full cost of initializing it.  Right now that means that each "kind" of FormatterStep - regular, closeable, and neverUpToDate - has to have a regular and a "lazy" version.

This was an experiment to see if it made sense to have lazy be orthogonal to the other kinds of FormatterStep, so it could be added on later.  It ended up just making things more complicated.