Understanding Concurrency: Concepts and Models for Programming