even better logging

Apparently when we try to print an attributed DefTree, it doesn't print
itself, but rather itself recreated based on the tree's symbol. Therefore
we have to stringify trees to be logged before entering the current phase.

Otherwise one could see really disturbing log messages like:
A07) def p3(): Double = p2 -> def p3(): Double = p2

When in reality it's more like:
A07) def p3(): valium.testcases.single.Point[Double] @unboxed = p2 -> def p3(): Double = p2
typechecking failures now log raw representation of the failed tree
okay let's try to see whether polymorphic value classes work
need to take TypeApply nodes into account
better explosion failures
deduplicating explosion logic