CharlesWeir:
Do bytes ever get lost? I.e. do I have to have some kind of flag byte to resynchronise packet starts (ASP effectively uses carriage return; nanopb seems to assume there’s no lossage)? And if I do that, do I need to escape the flag byte when sending packet data?
Yes, data can get lost.
You don't need to escape your synchronization bytes as long as you have some way of detecting a failed transmission. Look for a sync byte only between messages. If the sync byte you find is the start of a new message then you are good to go. If it's in the middle of a failed message you will eventually detect a second failure and go back to looking for sync.
You could implement SLIP (Serial Line Internet Protocol) and TCP on top of that. That will insure your messages get through and remain in order. It also allows multiple separate streams over the same serial connection.