Reduce memory usage with string pooling

For a 100MB file, we previously used 772MB, but now only need 628MB
(81% of the previous size). Xmllint uses 750MB (we are 84% of
xmllint!).

For a 10MB file, we previously used 87MB, but now only need 77MB (88%
of the previous size). Xmllint uses 79MB (we are 97% of xmllint!).

There is a small speed penalty though. We used to take 410 ms to parse
the 10MB file, but now take 432 ms (105.3% of the previous
time). Xmllint takes 331 ms (we are 130.4% of xmllint).