Improve multiply performance
Improve multiply performance

The main idea here is to do as much as possible with slices, instead of
allocating new BigUints (= heap allocations).

Current performance:

multiply_0:	10,507 ns/iter (+/- 987)
multiply_1:	2,788,734 ns/iter (+/- 100,079)
multiply_2:	69,923,515 ns/iter (+/- 4,550,902)

After this patch, we get:

multiply_0:	364 ns/iter (+/- 62)
multiply_1:	34,085 ns/iter (+/- 1,179)
multiply_2:	3,753,883 ns/iter (+/- 46,876)

jbcrail/num,rust-num/num-bigint,jbcrail/num,koverstreet/num,rust-num/num-traits,koverstreet/num,rust-num/num-integer,rust-num/num-traits,rust-lang/num,vks/num,vks/num,DonSheddow/num,rust-num/num,anchovieshat/num,anchovieshat/num,rust-num/num,rust-num/num-integer,rust-num/num-bigint,rust-lang/num,DonSheddow/num