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 (fit into an 
Int), 
IS constructor
is used. Otherwise 
IP and 
IN constructors are used to
store a 
BigNat representing respectively the positive or the
negative value magnitude.
Invariant: 
IP and 
IN are used iff value doesn't fit in
IS