Basically keep a freelist of each power-of-two segment and look through those when allocating segments. If none remaining, go see if there's any larger-than-requested segments that can be split, before asking the arena for more memory.
I guess if I do that latter bit, I need metadata to know if the segment is still part of a larger contiguous segment or not. Otherwise, a split and later free could gradually leak larger segments. Maybe I could coalesce it all at some point, or not care for now.
Added basic pool of segments, segment lists/maps now are pooled.
Looking at string escape expansion for string tokens (normalized to their unescaped form then interned), and string escaping for sanitization when reporting strings with unprintable/control codes/whitespace/quotes/UTF-8 in them (extended chars/UTF-8 when supported could be cool, but want a way to fallback to printable ASCII range). Also implemented first pass at UTF-8 encoding/decoding of single codepoints, codepoint length.