Add underlying type to Balsa enums.

Otherwise the static_cast<ParseState>(-1) in HTTPBalsaFrame.ParseStateToString
in is undefined behavior.

The C++ standard states: "A value of integral or enumeration type can be
explicitly converted to a complete enumeration type.  If the enumeration type
has a fixed underlying type, the value is [...] converted [...] to the
enumeration type.  If the enumeration type does not have a fixed underlying
type, the value is unchanged if the original value is within the range of the
enumeration values, and otherwise, the behavior is undefined."  See
(The actual standard is not available for free, this is an official draft.)

In other words, conversion of any value is well-defined if the enum has an
underlying type, but not otherwise.

I can reproduce by compiling the following example:

enum ParseState {

int main() {
  ParseState state = static_cast<ParseState>(8);
  return state + 2;

clang -fsanitize=undefined -l:libstdc++.a && ./a.out runtime error: load of value 8, which is not a valid value for type 'ParseState'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior in

And if I add ParseState : int, the error goes away.

This was caught by Envoy ASAN CI, and is blocking Balsa integration to Envoy.

Once here, add underlying type to all enums in balsa_enums.h.

PiperOrigin-RevId: 448474661
diff --git a/quiche/balsa/balsa_enums.h b/quiche/balsa/balsa_enums.h
index 2c067b6..9302881 100644
--- a/quiche/balsa/balsa_enums.h
+++ b/quiche/balsa/balsa_enums.h
@@ -10,7 +10,7 @@
 namespace quiche {
 struct QUICHE_EXPORT_PRIVATE BalsaFrameEnums {
-  enum ParseState {
+  enum ParseState : int {
@@ -25,7 +25,7 @@
-  enum ErrorCode {
+  enum ErrorCode : int {
     // A sentinel value for convenience, none of the callbacks should ever see
     // this error code.
     NO_ERROR = 0,
@@ -113,7 +113,7 @@
 struct QUICHE_EXPORT_PRIVATE BalsaHeadersEnums {
-  enum ContentLengthStatus {
+  enum ContentLengthStatus : int {