Arbitrary precision integers. In contrast with fixed-size integral
types such as 
Int, the 
Integer type represents the
entire infinite range of integers.
Integers are stored in a kind of sign-magnitude form, hence do not
expect two's complement form when using bit operations.
If the value is small (i.e., fits into an 
Int), the 
IS
constructor is used. Otherwise 
IP and 
IN constructors
are used to store a 
BigNat representing the positive or the
negative value magnitude, respectively.
Invariant: 
IP and 
IN are used iff the value does not fit
in 
IS.