replace Enum with Gen

**This is not to be merged** (yet)

I'd like some discussions about the patch itself, but since tests currently do not compile (some of them still use `Enum` or assume `List.of_enum` still exists) it cannot be merged yet into 3.0. Decoupling `Enum` from the other modules (using `Gen` instead, which is structural) is the first step on my list to split batteries (following is: making `IO` channels structural, and then decoupling `Unix` from the rest).