Designing and Building Parallel Programs: Concepts and Tools for Parallel Software Engineering