BigNum Optimizations

I've implemented some optimizations for the ``BigNum``/``bignum`` type. Mainly, I've consolidated some of the functions and modules together (e.g., so that module functions are now implemented as static methods of the ``BigRationalLarge`` type).

I've also changed the ``BigRationalLarge`` type to be defined as a normal class instead of a single-case discriminated union. Single-case DUs are compiled into an abstract base type and a derived type, meaning we have to pay a small casting cost each time the case is used; by defining ``BigRationalLarge`` as a normal class, this overhead is avoided.

I've run the test suite against these changes and there were no failures. In addition, the public API is unchanged so this change shouldn't break any consumers.