[sgen] Don't stack overflow when there are too many binary protocol buffers.

Binary protocol buffers are linearly linked from newest to oldest, but need to be
written out from oldest to newest.  This was sloppily implemented with a recursive
call, which caused a stack overflow when there were too many buffers.  We now
allocate an array and store pointers to all the buffers in it, then iterate over it in
reverse.