parse: make readUntil(byte) much faster
parse: make readUntil(byte) much faster

By reusing bufio.Reader.ReadBytes(byte), we can avoid having to read
byte by byte with our extra logic and work. Also reduces memory usage.

name                 old time/op    new time/op    delta
Parse/Empty-4          1.18µs ± 6%    1.19µs ± 5%     ~           (p=0.643 n=10+10)
Parse/Whitespace-4     7.61µs ± 3%    7.46µs ± 2%   -1.97%        (p=0.009 n=10+10)
Parse/Comment-4        3.71µs ± 6%    1.74µs ± 3%  -53.07%         (p=0.000 n=10+9)
Parse/LongLit-4        13.5µs ± 3%    13.9µs ± 3%   +2.84%        (p=0.006 n=10+10)
Parse/Cmds-4           22.3µs ± 4%    22.4µs ± 2%     ~            (p=0.278 n=10+9)
Parse/SglQuoted-4      4.86µs ± 4%    3.08µs ± 3%  -36.68%        (p=0.000 n=10+10)
Parse/DblQuoted-4      6.92µs ± 2%    7.17µs ± 3%   +3.62%        (p=0.000 n=10+10)
Parse/NestedStmts-4    16.9µs ± 3%    17.0µs ± 5%     ~           (p=0.393 n=10+10)
Parse/Clauses-4        14.0µs ± 1%    14.1µs ± 2%     ~             (p=0.588 n=8+9)
Parse/CmdSubst-4       14.1µs ± 4%    14.1µs ± 3%     ~             (p=0.846 n=9+9)
Parse/Binary-4         10.6µs ± 1%    10.6µs ± 3%     ~           (p=0.912 n=10+10)
Parse/Redirect-4       11.2µs ± 3%    11.2µs ± 1%     ~             (p=0.546 n=9+9)
Parse/Arithm-4         15.7µs ± 3%    15.8µs ± 1%     ~             (p=0.387 n=9+9)

name                 old alloc/op   new alloc/op   delta
Parse/Empty-4          4.26kB ± 0%    4.26kB ± 0%     ~     (all samples are equal)
Parse/Whitespace-4     4.26kB ± 0%    4.26kB ± 0%     ~     (all samples are equal)
Parse/Comment-4        4.63kB ± 0%    4.48kB ± 0%   -3.28%        (p=0.000 n=10+10)
Parse/LongLit-4        5.25kB ± 0%    5.25kB ± 0%     ~     (all samples are equal)
Parse/Cmds-4           9.24kB ± 0%    9.24kB ± 0%     ~     (all samples are equal)
Parse/SglQuoted-4      4.90kB ± 0%    4.74kB ± 0%   -3.10%        (p=0.000 n=10+10)
Parse/DblQuoted-4      4.97kB ± 0%    4.97kB ± 0%     ~     (all samples are equal)
Parse/NestedStmts-4    7.01kB ± 0%    7.01kB ± 0%     ~     (all samples are equal)
Parse/Clauses-4        6.07kB ± 0%    6.07kB ± 0%     ~     (all samples are equal)
Parse/CmdSubst-4       6.34kB ± 0%    6.34kB ± 0%     ~     (all samples are equal)
Parse/Binary-4         6.36kB ± 0%    6.36kB ± 0%     ~     (all samples are equal)
Parse/Redirect-4       6.50kB ± 0%    6.46kB ± 0%   -0.61%        (p=0.000 n=10+10)
Parse/Arithm-4         6.11kB ± 0%    6.11kB ± 0%     ~     (all samples are equal)

name                 old allocs/op  new allocs/op  delta
Parse/Empty-4            3.00 ± 0%      3.00 ± 0%     ~     (all samples are equal)
Parse/Whitespace-4       3.00 ± 0%      3.00 ± 0%     ~     (all samples are equal)
Parse/Comment-4          10.0 ± 0%       6.0 ± 0%  -40.00%        (p=0.000 n=10+10)
Parse/LongLit-4          17.0 ± 0%      17.0 ± 0%     ~     (all samples are equal)
Parse/Cmds-4             79.0 ± 0%      79.0 ± 0%     ~     (all samples are equal)
Parse/SglQuoted-4        16.0 ± 0%      12.0 ± 0%  -25.00%        (p=0.000 n=10+10)
Parse/DblQuoted-4        19.0 ± 0%      19.0 ± 0%     ~     (all samples are equal)
Parse/NestedStmts-4      57.0 ± 0%      57.0 ± 0%     ~     (all samples are equal)
Parse/Clauses-4          50.0 ± 0%      50.0 ± 0%     ~     (all samples are equal)
Parse/CmdSubst-4         54.0 ± 0%      54.0 ± 0%     ~     (all samples are equal)
Parse/Binary-4           46.0 ± 0%      46.0 ± 0%     ~     (all samples are equal)
Parse/Redirect-4         61.0 ± 0%      61.0 ± 0%     ~     (all samples are equal)
Parse/Arithm-4           62.0 ± 0%      62.0 ± 0%     ~     (all samples are equal)

mvdan/sh,mvdan/sh,mvdan/sh,mvdan/sh