refactor so BasicMessage is abstract and doesn't assume any json fields.