Cleanup Bignum handling regarding string handling

This had duplicate logic, but Integer also already has string handling.
We want to have a single place for an optimized version of turning a
string into a bignum, so this ensures we have one place to do it.
Fix memory usage for turning long strings into bignums

This was caused because relocation of managed mp_int storage means a new
ByteArray is allocated. Because there was no opportunity for doing a GC
during the loop, it would keep growing in memory usage.

By reusing the same non managed mp_int, this memory usage is greatly
lowered. It means less allocations and reallocations, leading to stable
memory usage.
Added specs for String#to_i with bases.
Moved some functions to libtommath.
Improved parsing String to Bignum.
Added simple String#to_i with Bignum benchmark.