Compensate for perf regressions in string-to-span parsing
When changing the implementation of TimeSpan parsing from string-based to span-based, throughput of some parsing regressed upwards of 15%. Some of this is due to more stack-based memory needing to be zero'd out, but it's not entirely clear to me at the moment where the rest went. To compensate, I optimized various portions of the TimeSpan parsing implementation enough to fully counteract the regressions; while there's still more that can be optimized if desired, all of the inputs/formats I tested are now as fast or faster than they were before, and on top of that, the span-based implementation is allocation-free whereas the string-based implementation would allocate a non-trivial amount of memory per parsing operation.
Note that there was a fair bit of dead code, which I removed. I think there's actually some more, but it was harder to prove, and so I left it as-is (the goal of this commit not being to clean up but to improve perf enough).