Formal Methods for Protocol Engineering and Distributed Systems