Suggestions for handling progression data
Depends a lot on how your game needs to be set up. If you can load it all into memory at the start it certainly makes it easier to work with and gives less loading time, on the other hand it might just be sitting around in memory a lot. That said if we use a 5 character utf16 quest ID paired with an int(worst case scenario) you're talking over a thousand quests in memory for 15 KB of space. Not the kind of data I'd be worried about.
I don't know the details of skyrim but based on their quest id's they probably use a map using a string as a key for the quest "name" paired with an int or a byte or something for the stage the quest is on.
I won't go into centralization cause that's usually demonized around here, you'll probably receive the suggestion to instead have some kind of class that is responsible for managing the state of quests, paired with something to serialize and un-serialize the data, and then giving whatever code needs to access it some indirect method(get it through the game class or have it passed as a list of services, etc.
In the absence of any other information, I'd start simple. Something like:
Dictionary<string, int> questStatuses;
The string would be the name of the quest, the int would be the arbitrary question completion level, as in your Skyrim example. It's just one object for all your quests. Read and write it in your save-game system. Add the name starting value when you start a quest. Have a standard value as the 'completed' score, or allow the quest logic to report whether it's in-progress/failed/completed based on the relevant value. (How you handle the logic itself is relevant, but not really covered here.)
The problem with trying to make it more 'elegant' is that each quest is different and they'll all have their own ways of representing progress and change. No generic enum will capture what you might want to do with every possible quest. Nor is there a fixed number of booleans you could use for the same purpose.
To some degree I'd want it centralised (like the above) because sometimes you'll want one quest to be able to respond to the progress of another. But since it's only really one object (containing a bunch of values) it's not really a concern.
Sharing any object throughout the code base tends to make the code all heavily dependent on it. That means that a change to that object can have effects all over the program, which in turn makes the program harder to maintain and debug. Generally speaking, each object's visibility should be limited to where it is necessary, not made globally accessible to be convenient.