Transactions are made outside of blocks, and transmitted unconfirmed between all nodes in a network; Nodes advertise new transactions assuming they pass verification to other nodes, who ask for the transaction if they have not seen it before.
It therefore seems redundant to include the full transaction within a block, because we can be pretty sure that most nodes already have most transactions, and if they are missing a transaction on receiving a block, must know at least 1 peer who can supply the transaction on demand (the node that sent them the block).
An SHA256 hash of a transaction is much smaller than an actual transaction, 32 Bytes versus at least 200 Bytes, so why not just list the transaction hashes within a block and let each node confirm they have all the transactions locally that are associated to that block, by calculating transaction hashes and confirm they have everything needed?
Im sure I must be missing something fundamental.
EDIT: I suppose its inefficient on storage, assuming we add 32 Bytes to every transaction, and then an associated 32 Bytes inside the block for each transaction. 100 Transactions per second would fit inside a 64KB block (at 20 seconds per block), but would add an additional, 188GB storage per annum. Even so storage is relatively trivial compared to block propagation, isn't it?