Improve uint128 carrying perf.
Improve uint128 carrying perf.

`mulShift()` computes three double-width products (b0, b1, b2). It can
be restructured to improve codegen by avoiding explicit carrying.

This takes advantage of the fact (used elsewhere) that double-width
products can absorb up to two single digits via addition without
overflowing. Here, we have b0, b1, and b2 partially overlapping.
The low 64 bits of b0 don't get added to anything (and are ignored,
because we shift them away later). The high 64 bits of b0 can be added
to b1, without overflow due to the double-width product property.
This is stored as mid. (The low 64 bits of mid are similarly ignored.)
Finally, the high 64 bits of mid can be added to b2, producing
the upper 128 bits of the sum.

ulfjack/ryu,ulfjack/ryu,ulfjack/ryu,ulfjack/ryu