1. Where is the size of the actual block stored in the message? Do you just send a TCP message ahead of the block that says "hey, the next block is 875,489 bytes long!" or is it encoded somewhere in to the block structure itself (apparently it isn't in the block header)?
Bitcoin has several P2P network messages, one of which is the Block message. Each P2P message (not just the block message) has a message header which contains information about the rest of the message, including the size in bytes of the message. You can read about the message header here:
https://bitcoin.org/en/developer-reference#message-headers2. Similarly, on disk, where is the record of how big each block is (so the filesystem knows how much data to read)? Is that in the chain state database, or it is stored in the BLK*.dat files themselves? Or somewhere else?
The blocks are stored disk as they are received over the network (without the P2P message header) with an additional compact size unsigned integer before the block indicating its length.