65,535 - 50,000 should be 65,536 - 50,000. Your load value would be 15536.
It takes 65,536 cycles (0 to 65,535 + 1 additional cycle) for the 16-bit
overflow or roll-over from 65,535 back to 0.

Why then do I have to preload the timer with 15543 to make it dead on? Is this just a difference in osc frequency.
Because the timer is still counting while you're doing things after it rolls-over.

You need to compensate for time passed (timer counts) while your program is
doing something after the roll-over. The timer is still counting during this time
frame.

You can either write an adjusted value to the timer, or simply "add" your real
value to the existing count already held in the timer registers.

Adding the real value to the existing timer count is the prefered method as
long as your program doesn't tinker around long enough to where adding to
the count would cause immediate over-flow after the add.