ChainId can be considered to be derived from the signature of a transaction, as described in EIP 155 - in the case of all of these transactions, they have the previous transaction format, where chainId is not present, which you can verify by checking the v value of these transactions (they are all 27 or 28, 0x1c or 0x1b).
As of December 2019 at least, it doesn't seem possible to do this. Read this discussion on Twitter for more details.
The best option is to chain the promises, as Ismael suggested in the comment above.
createTokenApprovalTx().then(() => createFooTx());
To connect to a blockchain you need a node which implements the blockchain functionality. Basically it's a client software. There are currently two major client platforms: Geth and Parity. It can be a bit cumbersome to run your own node but in theory anyone can do it.
Infura is a service provider. They basically just provide you with access to one of the ...
Many bad things may happen, here is incomplete list of them:
Anybody may sign transactions/messages with your private keys as long as you unlock them
Anybody may use resources of your node to query blockchain state (some queries could be very CPU and HDD intensive)
Anybody may use resources of your node to publish large amounts of transactions, i.e. when ...