Added simple solution for Challenge #3 Easy [C003_E]
Cleanup and parameterization of [C002_E]

  - Renamed GetCircularIndex to GetShiftedHead, refactored into curried function
  - Refactored shiftedChars value into ShiftList function, added parameters
  - Added support for optionally shifting numbers and punctuation
  - Refactored GetShiftedCharacter into GetShiftedValue, added parameters and
    created new GetShiftedCharacter, GetShiftedNumber, and GetShiftedPunctuation
    functions
Added Decrypt to [C002_E], refactored list management

  - Added charList type to manage 'original' and 'shifted' lists
  - characters, numbers, and punctuation are charLists that replace their
    valid_ and shifted_ counterparts
  - Moved GetShiftedValue out of EncryptMessage into CaesarCipher scope
  - Replaced GetShifted_ functions in EncryptMessage with Encrypt function that
    takes charList parameter
Refactored code in [C003_E]

  - Reorganized functions
  - Added lowercase list
  - Added Cipher function, takes a cipher and message argument where cipher is a
    function that takes a charList and char, replaced String.map calls in
    EncryptMessage and DecryptMessage
Added simple solutions for [C148_E], needs more organization
Updated solution for [C148_E], streamlined method 1 into match pattern
Expanded solution for [C148_E]

  - Added ICombinationLock interface
  - Implemented 5outh's and ooesili's mathmatical solution as CombinationLock2
  - Refactored CombinationLock3 as hybrid between CombinationLock1 and 5outh's
    and ooesili's solution. Allows for locks with more than 3 movements.
  - Implemented PrintLockInfo function to write message to console
Fixed bugs in [C148_E]

  - Made CombinationLocks 1 and 3 account for repeated numbers in a sequence by
    not spinning an extra time
  - Added handling to CombinationLock2 to account for the first digit being zero
  - Added PrintSuite function to automatically test an input on all three locks
  - Added a few more test cases