Parallel and Concurrent Programming in Haskell (Techniques for Multicore and Multithreaded Programming)