pub async fn read_frame<R, P>(reader: &mut R) -> Result<Option<Frame<P>>>where R: AsyncBufRead + Unpin, P: DeserializeOwned,
Read one frame. Returns Ok(None) on a clean EOF. Blank lines are skipped, so a frame boundary never depends on a caller flushing an empty line.
Ok(None)