Ideally we should have an instance for functions:
class Sendable a b | a -> b, b -> a where send :: a -> IO () receive :: IO b
This has contravariant narrowing though. Down the line, it will run into problems. Solution: split sendable into two definitions, one for sendable and one for receivable.
class (Sendable a' a, Sendable b b') => Sendable (a -> b) (a' -> IO b') where