Patterns and Skeletons for Parallel and Distributed Computing