Mathematical Structures for Computer Science: A Modern Treatment of Discrete Mathematics