serialize any objects as json, falling back to an object containing toString and error message if the object is not properly serializable

needed because the result of the "stop" effector is not json-serializable, causing activity calls (and view) to blow up when we invoke stop