add the ability to make copies of a parser, which all share a pointer to the same underlying string
use a copy of the parser to peek ahead, rather than save_position/restore_position
rename save_position; delete restore_position
rename parser::substr to substring