To answer my own question, I believe I do need to init_timer() my struct after any del_timer() or del_timer_sync() if I ever intend to access the struct again - for example, when doing a timer_pending() or something during module cleanup.

I think in the case of writing a kernel module which potentially re-uses a timer, the best thing to do is: