Major refactoring and changes to USSD code. USSD functionality now
follows a 'Bridge' design pattern, using abstraction so that it is easy
to implement different USSD protocols.