io: Add .read_at_least() to Reader

Reader.read_at_least() ensures that at least a given number of bytes
have been read. The most common use-case for this is ensuring at least 1
byte has been read. If the reader returns 0 enough times in a row, a new
error kind NoProgress will be returned instead of looping infinitely.

Also add .push() and .push_at_least() companion methods.

Stop using try_finally() in .push_exact() and instead use the new
.slice_capacity() functionality.