I guess it would change the API. You could have a separate file where you define an enum with all module identifiers plus a max value that all modules should include. Then you could omit whole hashmap dance and just use a static array. Then even an IDE or your text editor could give completions easily.
That would be less dynamic, but it's all a game of tradeoffs.
It could be beneficial to also support poll, as it's more portable and should be faster for low fd number. Probably not worth the hassle for a side project though.
BTW: nice clean and simple library. I'm more inclined towards libdill and coroutines, but they are certainly more complicated under the hood.