pub trait CustomRead<ErrType> { fn read(&mut self, data: &mut [u8]) -> Result<usize, ErrType>; }
this trait does not allow for transient errors: they must be retried in the underlying layer