shared: add minimal JSON tokenizer