Consistently implement #to_s and #inspect and remove implicit #to_s calls

(Originally #613)

I re-worked this to use `self.class` and `described_class` calls so that we can refactor without changing the tests constantly.