fold readListItem into readList (it's still optimized by v8, since it's a separate function)
minor cleanup
fix some corner cases in string lexing