You are missing something fundamental here - if a TCP
connection breaks (isn't closed cleanly) then the two
endpoints can get out of sync regarding how much data was
delivered. You can't fix this at higher layers without an
unacceptable amount of complexity and overhead. This has
nothing to do with the app/transport interface being a sacred
invariant - it happens any time you try to layer something on
top of transport that has to survive breakage of the transport layer.
And apps are in exactly that position today. This is still not a valid
reason to insist on adding complexity into the transport or IP layers.
Okay, well you've just demonstrated that you're insane.