empty만 기다리면 close 뒤 영원히 대기할 수 있어 종료 상태를 predicate에 포함합니다.
상태 snapshot
wait
dequeue
END 반환
put·close 뒤 알림
핵심: closed여도 남은 데이터가 있으면 drain한 뒤 종료할지 계약으로 정합니다.