Optimize syrup encoder
Right now the syrup encoder constructs a bytevector for each encoded object. Encoding composite data types involves concatenation of those bytevectors. This adds up to quite a lot of allocation and copying. Change to use a bytevector output port instead.