Made it easier to use ClientMsgProtobuf<BodyType> and ClientMsg<BodyType>

ClientMsgProtobuf<BodyType> and ClientMsg<BodyType> are in their current form makes it rather tedious to create wrapper APIs around specific game messages since you have to take all the relevant fields of a message as arguments to the function and manually assign each to the same field in the body.
This PR fixes that by adding an extra constructor that takes a BodyType instance as parameter so the wrapper API can simply do the same instead of a parameter for every single field in the message.

Essentailly this results in being able to wrap up resending and waiting for message responses in a neat generic class that can handle messages.

Example of how a wrapper function looks currently:
```
public async Task<CMsgSourceTVGamesResponse> FindSourceTVGames(ulong custGameId, uint heroId, uint leagueId, uint numGames, string searchKey, DateTime start, bool teamGames)
{
	CheckStatus();
	var req = new ClientGCMsgProtobuf<CMsgFindSourceTVGames>((uint)EDOTAGCMsg.k_EMsgGCFindSourceTVGames)
	{
		SourceJobID = _steam.GetNextJobID()
	};

	req.Body.custom_game_id = custGameId;
	req.Body.heroid = heroId;
	req.Body.leagueid = leagueId;
	req.Body.num_games = numGames;
	req.Body.search_key = searchKey;
	req.Body.start = ToUnixTime(start);
	req.Body.team_game = teamGames;
	
	return await _sourceTVGamesHandler.Request(req);
}
```

And how it would look with this PR:
```
public async Task<CMsgSourceTVGamesResponse> FindSourceTVGames(CMsgFindSourceTVGames msg)
{
	CheckStatus();

	var req = new ClientGCMsgProtobuf<CMsgFindSourceTVGames>((uint)EDOTAGCMsg.k_EMsgGCFindSourceTVGames, msg)
	{
		SourceJobID = _steam.GetNextJobID()
	};

	
	return await _sourceTVGamesHandler.Request(req);
}
```