This way new threads (!=main) don't need to explicitly call osmo_iofd_init() explicitly before using osmo_io. This is specially useful for threads using osmo_io indirectly, eg, when logging.
The osmo_iofd_setup() API is really the only main API which requires initialization. All other APIs requiring it come after osmo_iofd_setup() since they use an osmo_iofd pointer.