Processes as data types: Observational semantics and logic