This sounds rather strange to me.
For one, the error message indicates that the ID was already in use. I would check that there is no other app in the installation that by chance uses the same name. Also be sure there are no two versions of your app installed by accident in some crazy way.
Apart from that, I would use step debugging and see if the register function in the Application class is called once or multiple times per reload. Maybe you find the culprit by analyzing the situation and understanding what the core does. The code looks good to my by just looking through it. I though never used the dashboard widget system so far. So I cannot help you that much specifically here.
I would be interested in your findings.