Key challenges in Distributed computing: Parallel Skeletons, Load balancing algorithms and Multicore architectures