Can I implement key recovery without compromising security? I'm no crypto expert but I'm trying to figure out if this is possible:


I'm building an application that has access to very sensitive user data. 
I receive this data in plain text but I'm not allowed to persist it in this state.
When I receive data for user X, I must immediately encrypt the data using the key of user X. I can then persist the encrypted data.
User X needs to be able to grant the ability to decrypt their data to any other user in the system, for a defined period of time. All users in the system are trusted i.e. their identity is not in question.
The ability to decrypt user X's data can only be gained via user X explicitly granting permission i.e. even system admins should not be able to decrypt user X's data without permission being granted.


But, the most important part of all this is:


User X should be able to recover their key if they lose it. We can assume that I will have a solid multi-factor authentication flow to establish and verify the identity of user X.


So my questions are:


If a user loses their key, is there a way to recover their key without having to regenerate the key? So unlike the usual password-recovery flow, I'm not looking to simply regenerate a new key, because that would effectively orphan user X's data already encrypted with the previous key. Is this possible and/or feasible?
With [1] in mind, if an attacker gained full access to my database, is it possible to avoid keeping all the user keys in a central location that would expose me to this kind of attack?
How would I handle providing the ability to decrypt data to an arbitrary number of users without having to re-encrypt the data for each user? i.e. I will only ever have a single encrypted version of user X's data.


I hope this makes sense. I'm happy to try to provide a better explanation.

This answer feels very close, but I'm not sure it satisfies all my requirements: https://mathoverflow.net/a/62111

Any advice and/or guidance would be most welcome.
Delegating the decryption of encrypted data is exactly what proxy re-encryption (PRE) was designed to allow. In particular, there is a variant called time-based PRE that limits the delegation to a time period. See this paper for an example.

That doesn't really help with key recovery, though. You can encrypt the private key using a passphrase the user provides (run through a PBKDF function), but the user is still out of luck if she forgets the passphrase.