Fix issues with argparse

1. Typo issues between sync and Sync
2. getattr() () does not seem to work anymore. Fixed by splitting call.
3. Set sync as the default argument. The action="sync" in __init__ is now
redundant. But leaving it there for safety.
Introducing basic Exception Handling

This is a very bare bones exception handling mechanism.
Introduces pyCourseSync.exceptions module with two exceptions.
Expand this module to handle alll exceptions in the code.
Support --add-courses

This commit adds basic support for the --add-courses switch. This is still
a half-baked feature. Must add a check to eensure that the code conforms to
the format required by the script.
Rework argparse handling

Small changes to the User input handling mechanism. Create the course group
for mutually exclusive optins and then the outer group.

This grouping is required since the script currently handles only one action per
invokation. That is, it is notpossible to add some courses and then sync. This
feature needs to be added at a later time.
Script wil noww work from outside the Campus subnet.

This commit adds functionality to allow the script to access the CMS
portal using its external IP in case the machine is not within the campus IP
range. This uses a hackish mechanism to detect the path.

The script will check if the local IP starts with 172.16. If so, it uses the
local CMS IP, else it will use the external IP. This mechanism has many flaws,
that hopefully no one will ever see.
Add (lots) of debug print statements

This commit clutters the screen even more with loads of dirty debugging
statements. This was required to check a few things. Such statements should only
be printed, in a slightly more formatted fashion and in debug mode.

Someone, PLEASE implement logging levels!
Cacheing downloaded files for lesser bandwidth usage

Cache the id numbers of the downloaded files so as to prevent sending any
requests to the server for these files. This will help in reducing the nadwidth
requirements and speeds up considerably when using the external IP.
Automatically create new conf file if file does not exist.
Python 3.2 compatibility fix

This commit fixes a compatibility issue with Python 3.2

The FileNotFoundError and related family of exceptions were added
by PEP 3151 in Python 3.3. Until v3.2, we must use the archaic OSError
and determine the cause of the exception by comparing against errno, like
is done in C programs. That code has been added.