The `new`/`delete` calls for the `Token` allocations make up more than 30% of the Ir count when profiling with `callgrind`. It might make sense to implement a custom allocator or memory pool to reduce that.