You just connect to as many nodes as you can and store all block headers. If there is a fork, you will personally detect it and act on it. E.g. if your reimplementation of Bitcoin is buggy, you'll notice it by seeing a lot of fresh blocks that you cannot accept for whatever reason.
Right exactly. That is why all headers should be forwarded (even if the client .
The "chain" isn't really a chain, it is a tree. However, normally, the main branch is the only one that is extended. The tree becomes a single branch with a few small orphan branches.
When a fork happens, there are 2 branches that are being extended. Headers should be forwarded if they extend the tree, even if they aren't part of the main branch (and even if the blocks they represent are invalid).
I think it is better to give all nodes as much info as possible, rather than hoping that dishonest nodes won't forward the info.