ok so I think the idea is great but lemme explain why I think we shouldn't do this the way we do it here....
I think this is too specialized and we should simply have a `CachingTermEnumWrapper` that we can use elsewhere and test randomly as well. I think this wrapper should just use a simple `HashMap` like `new HashMap<BytesRef, TermState>()` for now to simplify things. It should be single threaded and have a very simple usage like:
```
public final class CachingTermsEnum extends FilterTermsEnum {
 public boolean seekExact(BytesRef text) throws IOException {
   TermState state = cache.get(text)
   if (state == null) {
     if (delegate.seekExact(text)) {
        state = delegate.termState();
     } else {
       state = NOT_FOUND_STATE;
     }
     cache.put(BytesRef.deepCopyOf(term), state);
   } else if (state != NOT_FOUND_STATE) {
       return delegate.seekExact(text, state); // this should be fast but we can also cache the state
   }
   return false;
}
}
```

makes sense?  that way we can just wrap the existing one and be least intrusive here?