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 means that people will get double-paid if there are two blocks in short succession and some people won't get paid at all for their shares.
Another option might be to keep a list of the people who have not yet been paid for their shares, and always pay the oldest shares first.