anchor.diff:      try {
         result = serializer.readFrom(stream);
       } catch (exception) {
  -      failures.add(new RoundTripDeserializationFailure(
  -          exception.toString(), uri, offset));
  +      failures.add(
  +          new TextDeserializationFailure(exception.toString(), uri, offset));
       }
       if (stream.moveNext()) {
  -      failures.add(new RoundTripDeserializationFailure(
  +      failures.add(new TextDeserializationFailure(
             "unexpected trailing text", uri, offset));
       }
       return result;
  
positive.code:   /// during the round trip.
    final int offset;
  
    RoundTripFailure(this.uri, this.offset);
  }
  
  class RoundTripSerializationFailure extends RoundTripFailure {
    final String message;
  
    RoundTripSerializationFailure(this.message, Uri uri, int offset)
        : super(uri, offset);
  }
  
  class RoundTripDeserializationFailure extends RoundTripFailure {
    final String message;
  
    RoundTripDeserializationFailure(this.message, Uri uri, int offset)
        : super(uri, offset);
  }
  
  class RoundTripMismatchFailure extends RoundTripFailure {
    final String initial;
    final String serialized;
  
    RoundTripMismatchFailure(this.initial, this.serialized, Uri uri, int offset)
        : super(uri, offset);
  }
  
  class TextSerializationVerifier implements Visitor<void> {
    /// List of errors produced during round trips on the visited nodes.
    final List<RoundTripFailure> failures = <RoundTripFailure>[];
  
    Uri lastSeenUri = noUri;
  
  
negative.code: 
  const int noOffset = -1;
  
  abstract class TextSerializationVerificationFailure {
    /// [Uri] of the file containing the expression that produced an error during
    /// the round trip.
    final Uri uri;
  