Выяснил-таки, на чём ломалась схема. Точка doDelete не может стереть пустой элемент. Как результат, я всё время его получал по doPop.
------------ Дoбавленo в 01.03:
Вычистил ещё пару багов в блоке разбора пришедшей строки. Упёрся в то, что наш RE_Search не понимает вот такую конструкцию:
(?:^|(?<= ))(:.*|[^ ]+)
------------ Дoбавленo в 01.25:
Обошёл проблему. Готовый код в прищепке. Для получения минимального IRC-клиента надо прикрутить чат (команда PRIVMSG), каналы (JOIN, PART; INVITE, MODE), список каналов (LIST) и пользователей (WHO).