Dynamic refactor

The way we were doing attributes was dumb and brittle and broke too easily when Thingiverse api changes or adds new return values.  So this change makes them more dynamic.  An added bonus is that we can now have thing.tags and thing.ancestors making it more logical.

Also file.upload can take a Tempfile as well as a File or a String.