Make `isempty(c::Channel)` a non-mutating operation (#36641)
Previously, `isempty(c::Channel)` would fall back to `iterate(c) ===
nothing`, which actually consumed a value from the channel. Instead,
let's just define it in terms of its internal datastructures.
(cherry picked from commit 44815002b377ca503d9c1e8adb28abed976a5ed1)