Is it necessary for blocks to record the nBits difficulty parameter? The next difficulty to solve a block is determined from how fast blocks were solved before it. In addition, the difficulty only changes once every two weeks or so. 

So, couldn't every node keep track of the expected difficulty and not need to have it in each block header? Or is there a reason nodes need to be communicating the current difficulty in each block? Not that it would be a major savings, or anything, it just seems strange that this is included when it's just a function of all the other pieces of a chain. 

Maybe it's because calculating nBits would take a long time eventually if you had to go through all the block headers every time you wanted to calculate the next difficulty?
Recall from the Nakamoto Whitepaper that for Simplified Payment Verification (SPV) clients, security is measured mainly by the amount of work done to secure a particular transaction.  SPV nodes can't use past headers alone to verify that an incoming payment is valid, so there's technically not much need to store past headers[1].  

Of course, if you're not going to store all the headers, you need some way to measure difficulty for the headers you do have---and nBits provides that.

Note that storing recent headers can increase an SPV client's security by allowing it to calculate proper difficulty for later headers.  This ensures an attacker trying to lie to the client has to create proper-difficulty blocks.  Still, a complete headers chain isn't needed here, so nBits is still useful as a starting value.

[1] But BitcoinJ and all other SPV clients I know about still do store complete headers.  At a guess, the reason they do is to help them detect chain re-organizations (reorgs) that would render a previously-received payment invalid.