Improve heterogenous equality between Spire types.

This commit was inspired by Bill Venners' email to the Spire ML
pointing out some problems with == on unsigned value types, and
asking about Spire's design philosophy.

It became clear that things were sort of hodge-podge, and that
we could easily do much better. This commit ensures that all of
Scala numeric primitives and Spire's numeric types support
symmetric == between then to the best of their ability.

While using typesafe === (Eq[A]) is still preferable, it's important
to try to support equals as well, for users who are using Scala's
collections, who find themselves interoperating between types
frequently, or who are from other languages and have not learned
to use === yet.

The biggest negative change is that the unsigned value types used
to support partial, non-symmetric == with primitives. I have removed
this, since there was no way to get it working reliably. We also
can't support symmetric == with BigInt/BigDecimal due to their
design.
add tests, patch holes, use tixxit's suggestions
Merge pull request #183 from non/bug/coop-equals

Improve heterogenous equality between Spire types.