Подумайте о значениях, которые вы захватываете в закрытии.
msgs[i].next = function() {handle_message(msgs[i+1]);};
Это фиксирует значение i
, но оно меняет следующую итерацию, поэтому вы получаете бесконечный цикл.
К концу цикла i это -1
, поэтому i+1
будет повторяться снова и снова.