osmo_io: Change struct osmo_io_ops to contain struct, not union

As we introduce more modes, and each mode aliases call-back function
pointers to those of another mode, we have more and more error cases
where we (for exampele) access read_cb, but in reality the user has
populated recvfrom_cb.

Let's use a struct, meaning that call-backs of one mode no longer alias
to the same memory locations of call-backs fro another mode.  This
allows us to properly check if the user actually provided the right
callbacks for the given mode of the iofd.

This breaks ABI, but luckily not API.  So a simple recompile of
higher-layer library + application code will work.

Change-Id: I9d302df8d00369e7b30437a52deb205f75882be3
diff --git a/TODO-RELEASE b/TODO-RELEASE
index a8e812b..3e75184 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -12,6 +12,8 @@
 core      ADD       osmo_sock_sctp_get_peer_addr_info()
 core      ADD       gsmtap_inst_fd2() core, DEPRECATE gsmtap_inst_fd()
 core		behavior change		osmo_tdef_fsm_inst_state_chg(): allow millisecond precision
+core		ABI change		osmo_io_ops now contains a struct of structs, not union of structs
+core		ABI change		osmo_iofd_set_ioops() now returns a value (error code)
 isdn		ABI change		add states and flags for external T200 handling
 isdn      ADD				initial implementation of the V.110 Terminal Adapter
 gsm		ABI change		add T200 timer states to lapdm_datalink