Behaviours provide a way to define an interface which a module can implement. A
module declares that it implements the Behaviour with the @behaviour annotation.
The functions in the modules implementing the behaviour will be checked at
compile time to see if they match the function specifications in the behaviour