Unreliable channels
Allowed to lose, duplicate, or reorder messages at any time
VAR
q := Q{} % as a multiset!
APROC Put(m) = << q := q + {m} >>
APROC Get() -> M = << VAR m | m IN q => q := q - {m}; RET m >>
THREAD Lose() = DO VAR m | << m IN q => q := q - {m} >> [*] SKIP OD
THREAD Dup() = DO VAR m | << m IN q => q := q + {m} >> [*] SKIP OD