Boost throw exception

This patch changes the code to use BOOST_THROW_EXCEPTION throughout - this leads to a number of advantages including enhanced Boost.Exception support and very nearly support for building with exceptions disabled: currently everything except the iostreams operators work without exceptions.

This patch also includes everything from https://github.com/boostorg/rational/pull/2, since it requires those enhanced tests.