Use fmt.Stringer or encoding.TextMarshaler if possible

An implementation for kr/pretty/issues/16 but also includes fmt.Stringer with priority given to Stringer before TextMarshaler.

I copied kr/pretty/pull/17 test implementation and added two other test cases.