thrift: clean up enum value assignment

    Summary:
    Clean up how enum values are handled if an integer value is not
    explicitly specified in the thrift file.

    For example, the following used to be a compile error, but
    works now:

      enum MyEnum {
        SOMEVALUE
      }
      struct MyStruct {
        1: MyEnum e = SOMEVALUE
      }

    This change also cleans up some of the error handling with out-of-range
    values.  Previously thrift simply issued a warning for enum values that
    didn't fit in an i32, but serialized them as i32 anyway.  Now
    out-of-range enum values result in a compile failure.

    Test Plan:
    Included a new unit test to verify the assignment of enum values.  I
    also verified that g++ makes the same enum value assignments when
    compiling these enums as C++ code.