Nice work! The only glitch I noticed is that the value field in a TxOut is 64 *bits* long, i.e. 8 bytes. Most other field lengths seem to be in bytes.
I hadn't delved into the details of OP_CHECKSIG before, and hadn't realized it was this complicated. Thanks for sorting this all out for us!