Beginning of mass rewrite, dynamic methods, properties, see full summary

Yes, I feel terrible for such a huge single commit but it must be done

Changes (mostly complete)
=========================

New and more efficient http downloader, dict-like container that automatically fetches when needed.

Dynamic method builder

Remove old and badly designed *_request base classes

Optimize kill rank builder for items, remove regexp search and do intelligent sorting based on attribute name

Made everything that needed to be properties properties! Only a few getters are remaining

Made quality and attribute maps a little more efficient and added method to transparently convert ID to names and vice-versa

Renamed some methods to something more proper, including get_attribute_definition -> _attribute_definition,
removed _get_attribute_id_for_value

Added _quality_definition (similar change to _attribute_definition)

Updated iterators to be compliant with the spec (rename methods that needed to be to next())

Removed sorting where it wasn't needed, items are now built as iterated/getitem'd instead of
all of them being built at once in deserialization

Removal of tf2, tf2b, p2, d2, and d2b modules. What workarounds were needed are now in the base classes,
which now use app IDs directly instead of vague module globals. The deprecated golden wrench
API was also removed.

Removed item_type parameter for schema (not needed due to removal of afore mentioned modules)

Made item.quality return a tuple instead of dict in the form of (id, name, localized name)

Removed get_equipped_classes, not needed and inaccurate due to dynamic slots. Use item.equipped

Added item.icon and item.image to replace get_image, icon is the small thumbnail, image is
full size

Renamed item.class and attribute.class into cvar_class, which is less ambiguous

In addition to afore mentioned property changes, is_untradable and is_uncraftable are now reversed
to the less-confusing and simple item.tradable and item.craftable

In addition to afore mentioned property changes, item.get_full_name is now item.full_name, which
no longer uses a prefix dict (the user can simply strip off "The " themselves) and is a little bit
smarter in how it generates names, including not including "Normal " in front of an item.

Removed get_origin_id (wasn't really used, may add property later)

Made schema to inventory item attribute merge a bit smarter, no longer merges attributes that are already there

In addition to afore mentioned property changes, added __getitem__ to inventory to allow inventory[id] calls.

As with the schema iterators, the inventory iterator now also creates items as items are retrieved instead of iterating
through the entire inventory and building them all at once. Also removed item_type for similar reasons as above.

Simplified asset_item, removed special behavior (and parameter) for special single-prices only. It doesn't make much
difference in size and speed, and is less consistent. Sorry Wind. You'll just have to change a line or two. As with
schema and inventory, items are created as iterated or fetched.

Renamed user_ugc to the more appropriate ugc_file, also removed the unneeded and unused user ID parameter.

Changed some requests to try harder to return something useful even if errors happen.

Renamed "backpack" classes to the more appropriate "inventory"

Changed sim backpack_context.get_app to inventory_context.get

Made sim.inventory a little more closely matched to items.inventory, also added __getitem__ for inventory[id] calls

Made sim.inventory ctor parameter order (app, then user)  match items.inventory's. Note that the same objects will not work
sim.inventory still requires an app dict

Removed a bunch of stubs from sim.item_attribute and instead made items.item_attribute more robust in how it deals with
missing data

Removed stubs from sim.item and made items.item hardier, note that schema_id can and will return None

Overrided tool_metadata property in sim.item to expose app_data

Made sim.item.quality more intelligent (will return default normal quality tuple if none are found, but tries to take the quality from
sim.item.tool_metadata if it's there)

Added sim.item.icon and sim.item.image, similarly to items.item

Removed stubs from sim.item and items.item

Removed sim.item_schema entirely, not used or needed

Simplified vanity_url, made id64 a property

Replaced get_avatar_url with avatar_small, avatar_medium, and avatar_large properties

Made steam.user.profile.current_game a tuple of the form (app ID, server IP:Port, extra info/name)

Made steam.user.profile.location return a touple of (state code, country code)

Replace ugly path stripping code in steam.user.profile ctor with simple strip call and basename
Update copyright, setup.py and module metadata, remove redundnant license data

Changed setup.py to reflect steamodd's new home and my address,
also added additional classifiers. Removed old description for
new one.

Added some module metadata variables which are defacto standard
these days, and use them in setup.py where necessary.

Remove python 2.2 compatibility in setup.py, because honestly
if you still use it at this point you deserve what you get.

Removed AUTHORS file, has been redundant for years now and is
in general redundant in python due to __author__.

Removed redundant license headers in favor of 3 line description,
copyright, and license reference. Because really gigantic walls of
text are not needed legally and no fun for anyone.

Updated copyright to current year
Remove base.py, split core into api and loc, exception cleanup

I can't remember there being any real purpose of the base
module. It was mostly acting as a place to contain stuff
that really shouldn't be contained there, and was otherwise
doing what should be in the __init__ module.

Core code that was in the base module is now split into the
new api and loc(alization) modules. This also cleans up needless
exception boilerplate and is the beginning of a more clean and
standardized exception hierarchy.
Update and expand README and add a bit of history
More granular exception hierarchy, improve naming consistency
Remove control char stripping

Just used up extra cycles and probably isn't needed anymore.
Handle HTTP errors in exception block
Better and more portable unicode in vdf
Achievement unlocked: Python 3 compatibility
A saner implementation of the venerable unicode_damnit

Can't explicitly check for unicode instances due to python3
compatibility requirements.
Handle pre-encoded strings in vdf. Fixes #3

Yes it's ugly and backwards, but this is the wonderful world of pre-3
string encoding. This is why the byte type was added, because people
think it's really weird that when they try to decode ascii shows up.
This is because it's trying to convert it into a byte sequence first.
But since there is no actual byte type in pre-3 python, thar you go.
Initial STI code (Steamodd Testing Initiative)

Removes old and incompatible test.py script, adds empty tests
dir/module.

Adds custom distutils command to run unit tests, uses discovery. Just
write tests/test*.py files and you're good to go. (See finalize_options
for an example of how to get command opts into a usable form)
Handle vanity strings with path characters
Set API key directly in test runner
Add initial steam.user test fixtures
Add initial vdf test fixture
Convert vdf stream into bytearray before decoding
Track whether a string is a key; Fixes #4.