I'm not sure how this refactoring really helps us avoid checking a blob.  I think its a massive amount of over-engineering for a simple problem.

We don't want to materialize the entire content of a blob in order to check it, because there isn't a reason to check the blob, we can't verify anything about it except compute its SHA-1... which IndexPack already has to do in order to build the index file.

Git usually doesn't create new object types.  In 5 years we are still using the original 4 object types that Linus Torvalds defined.  We could just as easily add a test to IndexPack that says something like:

  if (type != OBJ_BLOB)
    check(data);

That is a much simpler change.