add basic "sessions" functionality

tenk/sessions.py: Allows user to log more detailed data about a
session. Specifically - date of practice session, time spent practicing,
and details about what was practiced (optional), what
improved (optional), and what the user plans to focus on next
session (optional). All of this data is stored in an XML file.

Docstrings were updated for: tenk/skills.py, tenk/users.py
update leveling system

tenk.skills.py: change from 10 levels to a saner 100 levels. 1000 hours
to level up was a bit much.
tenk.skills.py: adjust calcprogress method to reflect level change.
tests.skills_test.py adjust calclevel tests to reflect level change and
add unit tests for calcprogress
change docstring format

I really like having header comments surrounded by pound signs, but I've
relented to using proper docstrings as per pep8.
add "test runner", runtests.sh, for convenience
update runtests.sh to take a param

primarily so I can easily run tests with verbose output.
move print_progress logic from users.py to skills.py

I originally had the print_progress function in users.py because it made
sense for a user to be able to print her own progress. Upon thinking
about it, I feel it makes more sense for a skill object to print out its
own progress, especially since it's already calculating its own level
and progress. So I moved the calculations and formatting/printing over
into skills.py and users.py's print_progress function just loops through
the skill objects and calls its print_progress function.
improve naming consistency

users.py/skills.py: various method names changed to use snake_case
skills.py: add more detail to progress printout
replace menu-based interface

Ripped out the menu interface in favor of a traditional CLI. I
was originally going to keep both as the menu interface can be rather
convenient; however, I decided I didn't want to maintain both.

The new interface is influenced by todo.txt's CLI, where to modify any
todo you enter its number.
add session update functionality

tenk/sessions.py: If there already exists session data for a given date,
the new data will be "merged" with the old data. Specifically, hours
will be added together and any extra notes will be appended to any old
notes. Methods find_existing_session and update_xml were created for
this functionality.
bugfixes/changes in sessions.py

tenk/sessions.py: fixed an issue with poor indentation/formatting
because of the way lxml handles whitespace using the remove_blank_text
option.
tenk/sessions.py: convert custom dates into a datetime.date object in
object initialization
tenk/sessions.py: fixed TypeError by using getroot(). parse() returns an
ElementTree rather than an Element, which caused a TypeError when the
program tried to append a new skill node.
tenk/sessions.py: when updating a session I had checked for the case where
there were no hours already logged, but not for the case
where there were hours logged but the user did not pass in any new
hours. This resulted in my program trying to add float() and Nonetype.
tenk/sessions.py: created serialize_and_save() method. mostly for
aesthetics. It seemed weird to type xml = session.generate_xml() and
then session.save(xml). It made more sense to encapsulate that with
session.serialize_and_save().
overhaul CLI

Major overhaul of CLI to use subparsers for a logical grouping of
commands and more sensible CLI commands.
fix small time log bug

tenk/sessions.py: changed conditional so that no new hours node is made
if the hours attribute is None
Merge remote-tracking branch 'origin/master' into dev
pull some methods out of main.py and move into utils.py

I'm planning on adding a GUI at some point and realized some of the
methods in main.py could be utilized by the GUI. So it made sense to pull
those methods out into a utils file.
add unit tests for utils.py

A couple of small unit tests for utils.py. This was primarily an
exercise in mocking.