About the second point : seems complicated. How about simply putting the 599 previous shares in every found share, and when one is a "winner", pay all the previous 599 shares ? Regardless whether they are from a previous block or not. This is much simpler, allows complete decentralization and still pool-hop resistant.
This could work, but variance would be quite a bit higher. P2pool only keeps a chain of shares made since the last p2pool-generated-block in the blockchain (each share points to this last-generated-block). If p2pool looked past that block into the shares for the previous round, it would be vulnerable to somebody generating a block that looks like it was generated by p2pool, but with all the reward going to them, among other things. Then, any p2pool blocks in the next 600 shares would pay a chunk of their reward to the evil creator of that fake block.
With how it is currently, all a fake block does is reset the round, thereby increasing variance a bit. There is a constant fee that goes to me in every block in place to make this not worth it. (You'd have to pay a little less than 1btc for every time that you reset the p2pool round.)
Looking at previous rounds would be more complex - what happens if a node can't find shares from a previous round? (This could happen if an evil person generated a block referencing shares but didn't publish them)
I'm thinking about it and am going to try implementing it.