Send QUIC GOAWAY after given time even if connection not idle.

Note that in HTTP/2, timeout is checked each time a request is terminated.
However, I chose to use a timer for QUIC instead.  This will allow GOAWAY frame
to be sent even if the only active request is hanging for a long time.

Protected by FLAGS_quic_reloadable_flag_quic_max_age_send_goaway.

PiperOrigin-RevId: 341853883
Change-Id: I0644e7e17637fdf9c6694073d5d388632c90337a
diff --git a/quic/core/quic_error_codes.cc b/quic/core/quic_error_codes.cc
index a57ded8..9abde9f 100644
--- a/quic/core/quic_error_codes.cc
+++ b/quic/core/quic_error_codes.cc
@@ -255,6 +255,7 @@
     RETURN_STRING_LITERAL(QUIC_MISSING_WRITE_KEYS);
     RETURN_STRING_LITERAL(QUIC_KEY_UPDATE_ERROR);
     RETURN_STRING_LITERAL(QUIC_AEAD_LIMIT_REACHED);
+    RETURN_STRING_LITERAL(QUIC_MAX_AGE_TIMEOUT);
 
     RETURN_STRING_LITERAL(QUIC_LAST_ERROR);
     // Intentionally have no default case, so we'll break the build
@@ -713,6 +714,8 @@
       return {true, static_cast<uint64_t>(KEY_UPDATE_ERROR)};
     case QUIC_AEAD_LIMIT_REACHED:
       return {true, static_cast<uint64_t>(AEAD_LIMIT_REACHED)};
+    case QUIC_MAX_AGE_TIMEOUT:
+      return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR)};
     case QUIC_LAST_ERROR:
       return {false, static_cast<uint64_t>(QUIC_LAST_ERROR)};
   }