Break document traversal logic out into its own class: DocumentWalker
Reimplement document copy based on DocumentWalker
implement DocumentDigester