ReadTimeoutHandler IdleStateHandler fires after handler destroyed

Motivation:
The ReadTimeoutHandler and IdleStateHandler read timeout event does not check if the handler is destroyed before a timeout event is dispatched.  This can lead to timeout events being dispatched at incorrect times and scheduling events longer than necessary.

Modifications:
-IdleStateHandler to check if handler is destroyed before dispatching another event and scheduling a new task
-ReadStateHandler needs to same changes

Result:
IdleStateHandler and ReadStateHandler clean up is more correct.
@normanmaurer This PR was designed to help with issue https://github.com/netty/netty/issues/2961. I'm not convinced this will in fact help because the individual who reported the issue @diwakergupta cannot reliably reproduce the issue and I don't think they have tried this PR. The issue https://github.com/netty/netty/issues/2961 has more details and I never completed investigation to find the root cause.

The cancel operation I believe is to clean up resources as soon as they are not needed.  I have added extra code in the Runnable to stop execution and reschedule if state has changed. This may be a bit redundant but was more exploratory to see if I was in the right spot