@Nitrodon Nice answer. I'm still mulling over the whole thing. Based on the encoder/decoder differences it looks like I chose a more dense way of encoding information but your method paid off by having a golfier decoder.
@H.PWiz Comparison of versions. I'll have to remember that the {({}<...>[()])} idiom is shorter than the {{}...([][()]) idiom, that seems really useful
Although, the {{}...([])} should generally be shorter, it's just not once you have to keep an additional counter on the stack and loop (height - 1) times