sanitize donorsChoose response in try/catch block

#### What's this PR do?
This PR: 

1) **moves API parsing logic into the try/catch block.** 
A little hard to tell from the git diff, but this PR moves all the DonorsChoose.org API response manipulation logic (parsing it into JSON, pulling out a proposal that satisfies our criteria, and assigning variables to certain properties) into the try/catch block. 

In the case that the API returns a proposal which has missing data, we're putting all our logic into the try/catch block so that any undefined variables won't throw an exception and crash the whole app. 

2) **fixes the `selectedProposal` comparison logic so that it actually compares numbers, instead of strings (now we're including `parseInt()`**
3) **declares the `selectedProposal` variable outside of the loop, so that it's not re-created with each time the loop runs.**

#### Where should the reviewer start?

#### How should this be manually tested?
Running through the DonorsChoose donation flow with Postman. 

#### What are the relevant tickets?
Closes #260 
This seems unlikely, but I think it's also good practice to still handle the possibility of `selectedProposal` being undefined/null here. `proposals` could come back empty (unlikely, but possible), or our logic in the `for` loop might not find a matching proposal (not possible with the current logic, but possible if someone comes to change that logic up later).

So I'd personally wrap up the rest of this in a `if (selectedProposal)` check and handle the case if somehow there was no proposal selected.