How could block propagation time be reduced? This website measures block and transaction time propagation.. At the time of writing, the time required for 90% of surveyed clients to get a block is about twelve seconds. (I just averaged the last five days.)

How could this be reduced? On a related note, what are the major causes of propagation delay? Is this primarily caused by network latency, network bandwidth, or by clients verifying the block?

Related:


How long does it take for blocks to propagate?  
"Information and Propagation in the Bitcoin network", by Decker and Wattenhofer.
Gavin Andresen wrote a bit on the topic here: O(1) Block Propagation.

Essentially, he is implementing the conclusion from your answer, a way to get around resending all transactions when propagating a new block. He is working on implementing Invertible Bloom Lookup Tables to use for set reconciliation. IBLT excel at comparing sets of significant overlap, and therefore are very efficient at relaying the differences between included transactions and Mempool of recipient.