Handle JSON startup errors more gracefully

User data with invalid JSON no longer breaks everything, and the base
config is no longer overwritten with the default.