
Algorithm:
    - genePred input requires single-CDS coverage of the source organism,
      which can be created with genePredSingleCover

    - load genes and break into CDS exons in a binKeeper table addressable
      by source location. (module orgGenes)

    - scan MAF files and associated construct exonFrames objects
      mapping regions of the exons to the target genome.  This algorithm
      avoids the need to load the entire MAF into memory, or even to
      have it sorted. (module mkMafFrames)

    - split genes that map to multiple locations, or where exons have been
      rearranged, or where a maximum intron size is exceeded into separate
      gene objects.  This prevents linking splice codons between these
      genes. This doesn't do a very elegant job of this. (module
      splitMultiMapping)

    - link prevFramePos/nextFramePos entries for split codons that
      are continued in another mafFrames object.
      (module finishMafFrames)

    - output mafFrames for all genes

Notes:
    - use of static functions in many modules allows for implict inlining.

    - both this code and the browser required no overlapping CDS exons

    - strand in mafFrames matches the direction of transcript as projected
      onto the target species:
              maf   maf
         gene query target annotation
         +    +     +      +
         -    +     +      -
         +    -     +      -
         -    -     +      +

    - the prevFramePos and nextFramePos are used for rendering codons that
      are split in the target.  These fields are in the direction of
      translation. mafFrame rows are linked by the prev or next fields 
      if and only if the first/last codon is split across MAF records
      and the frame is continuous.
