Add self.get_updates(callback, period).

I needed both series and episode updates, so I wrote a new method that
returns all update info at once: get_updates().  It avoids a bug in
get_updated_shows() (which returns a bunch of None elements from the
nested Series data in Episode and Banner records).  It also makes the
update time available (via the "time" attr).  Finally, it changes the
URL used for all get_update*() functions to fetch the zip-file version,
for reduced transfer sizes.  As for speed, when I processed a week's
worth of updates, the runtime for my script went down from 1 second to
about 0.5 seconds (compared to a non-expat functiom that returned both
episode and series data via the ET method the other functions use).
Add "atleast = 1" arg to get_show_and_episodes().

In my use of get_show_and_episodes() I only need newer episodes to be
returned, so I added an arg to get_show_and_episodes() that allows an
episode ID to be specified (it defaults to 1 if omitted, for backward-
compatibility).  Specifying this value will stop the routine from
returning any episode objects with an ID lower than the atleast request
(avoiding a bunch of episode instantiations for older episodes).
Added self.last_updated_utime to Episode and Show.

For tasks such as comparing update times against the last_update value,
it's easiest to use a raw epoch-seconds value for last_updated.  In
order to avoid needing to try to convert the datetime value back into
unix time (and possibly getting a localtime epoch instead), I stashed
the raw int value in self.last_updated_utime (leaving self.last_updated
as it was).
Fix convert_time() to handle 12 am/pm right.

The code was treating variations of 12 AM as 12:00, and was trying to
convert 12 PM to 24:00 (which caused an exception).  Changing hour 12 to
0 before adding the PM offset makes 12 AM -> 00:00 and 12 PM -> 12:00.
Remove trailing whitespace and "print url" lines.
Get rid of unneeded check of "data" (for consistency).
Improve error handling in get_updates().
Follow the wiki instructions on selecting a random mirror.

The __init__() routine calls the new select_mirrors() function to select
an xml and a zip mirror.  Changed various uses of base_key_url to be
either base_xml_url or base_zip_url.
Remove superfluous StringIO().  Handle expat SyntaxError.
Fix two Combined_* tag names.
Switch show & episode parsing to expat w/improvements.

I changed the calls that return a show and/or (an) episode(s) to use the
expat parser.  In my testing of the full Jeopardy! data (about 2.4M worth
of show + episodes) the old code took about 1.8 seconds, while the new
took 0.6 seconds (both were parsing a local, uncompressed xml file).  I
also switched the get_show_and_episodes() call to download the zip data,
which will save a lot of bandwidth (e.g. that 2.4M of Jeopardy! data is
only 77K, for instance).  To add the latter feature I needed a language
abbreviation, so I added the ability to specify the language to the
TheTVDB constructor (which defaults to "en").
Fix attributes that get multiple char-data calls.
Make mirror grabbing code handle even a fetch error.
Need to check() the show's lastupdate value too.
Change all xml parsing to using expat.

Change the expat callback parsing to be more generic (instead of update
related) and use it for all our xml parsing needs.  This makes the code
share some helper functions (reducing complexity), uses less memory
(since the xml is parsed incrementally into our internal lists/objects)
and fixes a bug in get_updated_series() where it would return some bogus
items due to nested "Series" tags inside other tags.
Check "attrs is None" in stash_xml().
Use self.language when grabbing show info.
Switch foo.has_key(bar) to "bar in foo" (and its negation).
Short-circuit mirror fetching for the moment.
Tweak exception throwing in main xml-fetch routine.