Thinking Algebraically: An Introduction to Abstract Algebra