Distribution of Exon and Intron Sizes
At the command line:

wget ftp://ftp.ensembl.org/pub/release-84/gtf/gasterosteus_aculeatus/Gasterosteus_aculeatus.BROADS1.84.gtf.gz
gunzip Gasterosteus_aculeatus.BROADS1.84.gtf.gz


Then in R:

library(GenomicFeatures)
txdb = makeTxDbFromGFF("Gasterosteus_aculeatus.BROADS1.84.gtf")
hist(log10(width(unique(exons(txdb))))) # exons
hist(log10(width(unique(unlist(intronsByTranscript(txdb)))))) # introns


Note that some of the annotated exons (and the introns between them) are incredibly unlikely to be correct. For example, there are 1 base long exons and introns. I don't think anyone actually believes those are correct, but the distribution is probably otherwise approximately correct.

Edit: For what it's worth, there are no negative sized exons in the GTF file. My guess is that the overlapping exons are from different transcripts (or genes on opposite strands). 

Edit2: If you want to get your introns from a "union gene model", then use something like reduce(exonsBy(txdb, by='gene')) and then lapply gaps() to that. The results will be correct and the process will probably take less time than what you've been trying.