Implement a basic version of first-class enums in Hack.

Summary: Implement a basic version of first-class enums in Hack. They allow the declaration of enums with a specified underlying type that all of the constants are checked against. The actual type of all of the constants, however, is the name of the enum. Specifying 'as typ' after the enum name will cause the enum to be treated as a subtype of typ (typ must be a supertype of underlying type).

Reviewed By: @jwatzman

Differential Revision: D1428116