Exceptions and debug output cleanup

Exceptions have been implemented around the library, getting rid of all calls to exit(1)

Also, as it generally bad practice (in my mind) to have a library write to the standard output, I've made all output from within the library a debug-only feature. If the library is compiled with the NDEBUG macro defined, it will not emit anything. Otherwise it emits all the messages it had before.

Aside from those two, the only other change I made, complementing the second one, was to move the debug printing functions from datatable.cpp into datatable.h and making them templates that can accept any standard basic_ostream. That way a user could use those if he or she wants.