Add GMP support

To futher extensibility I changed all uses of double to use
the GMP library, which has arbitrary precision.  This way
we won't have any pesky rounding errors.

Note: When printing a value, make sure to include
      <iomanip> and call setprecision(x) to stop rounding