Exon objects

Added methods to EnsemblRelease:
* `exon_by_id(exon_id)`
* `exon_by_transcript_and_number(transcript_id, exon_number)`
* `exons_at_locus(contig, position)`

These return Exon objects, which in addition to basic location info, also track the offsets of start and stop codons. 

I'm not totally comfortable with Gene, Transcript, and Exon objects (neither their interface nor their current implementation, which makes lots of wasteful database queries). However, I haven't yet found anything more convenient for writing varcode. I'm open to scrapping these things later, once we understand a little more about how pyensembl can/will be used. 
Yeah, I just moved them out for independent testability and to clean up `load_gtf_as_dataframe`