Significant refactor; moves special treatment of pairs and tuples into the print helper and gets rid of dodgy overloads in namespace std. As a result, we now consider pairs and tuples to be containers.