Perform a little code refactoring.
Implement new error handling logic.

Add OPFIllegalStateException, RegistrationNotCompletedException and UnregistrationNotCompletedException for reporting about wrong registration / unregistration states.
Add new methods to EventListener interface for handling wrong state errors.
Add State enum for implementing registration / unregistration states.
Change registration logic.

If system preferred option is true then try register system provider.
If system preferred option is false then try register first available provider.
If get recoverable registration error (SERVICE_NOT_AVAILABLE) then retry registration with infinity exponential backoff.
If get unrecoverable error just notify user about this error via EventListener.
Add timeout of storing REGISTERING and UNREGISTERING states.