We rely on memory mapping files and accessing them through UnsafeRawMutablePointer, but that type makes it possible and easy to construct byte ranges outside of the original Data. We should have an abstraction (ByteSpan?) which only allows creating contained subranges for safety.