Investigate selecting related fields
That looks wonderful.
 I added support for this in 62bd00b90686aea6d6440ff129c30cf28a2a9449 -- basically, it takes what you pass in to the select() method, queries the db, constructs instances (and related instances), then puts them all together.  Can reduce your queries from _n_ to 1 when iterating and checking up the fk tree.  It doesn't go 'down' the chain, though...ie you can't select Blog and then preload their related entries, though implementing this in python is not hard.

From the test cases:

```
def test_select_related_multiple(self):
    qc1 = len(self.queries())

    sq = EntryTag.select({
        EntryTag: ['*'],
        Entry: ['pk', 'blog_id'],
        Blog: ['title'],
    }).join(Entry).join(Blog).where(title='b1')

    results = list(sq)
    blog_titles = [r.entry.blog.title for r in results]
    blog_ids = [r.entry.blog.id for r in results]

    self.assertEqual(blog_titles, ['b1', 'b1', 'b1'])
    self.assertEqual(blog_ids, [self.b1.id, self.b1.id, self.b1.id])

    qc2 = len(self.queries())

    self.assertEqual(qc2 - qc1, 1)
```

Would be nice to be able to populate (or partially populate) instances of related objects when querying.  Example would be querying a list of blog entries and wanting to additionally select the 'name' of the blog -- this can be done in 1 query with a join.

It shouldn't be too hard... related models can be queried passing a dictionary to Model.select() -- need to add the logic to the QueryResultWrapper.  Looking at the returned rows and converting them into a dictionary may not work here if column names collide, so might need to list the columns and assign based on index.

Now that fields are exposed using descriptors it sohuld be possible to do "deferred" loading of field data as well, i.e. if it wasn't selected but then is asked for.
