Register and Initialization cleanup

This radically changes the way RegisterAsync works:
- Separates the application name from the key
- Uses false return to indicate button not pressed, exceptions shouldn't be used for unexceptional situations or program flow.

Furthermore:
- IsInitialized is no longer publicly settable
- CheckInitialized() now throws InvalidOperationException instead of the base Exception.