Full type support for protos, including enums (!)

This can be in a follow-up, but the Dart specs for enum are:

```dart
class Enum {
  const List<Enum> values = const [ ... every possible value here in order ... ];

  final int index;

  const Enum(this.index, this._displayName);

  @override
  String toString() => _displayName;
}
```

If you follow this pattern, then once enums become stable

```dart
enum Something {
  BLAH
}
```

becomes super easy and compatible.