Replace the enum adapter tag map with an integer BST.

By not using a the map we avoid boxing the integer in both directions and the overhead of the underlying wrapper objects. The sorted array of enum values and the mirrored key array allows us to use a binary-search for reverse lookups. This operation is O(log n) which, while slower than the map's O(1), has no significant performance impact for enums with less then hundreds of values.

@swankjesse @danrice-square