There are generally two approaches to getting Monero functionality into other languages: 1) to make use of the JSON-RPC interfaces and 2) building Monero source files and creating bindings. The former is the simplest and easiest to maintain. The latter gives more fine grained control but requires thought for portability.
Jumping back to your requirements:
generate key pair, manually build a transaction, sign it and broadcast it to a remote node
Generating keys is fairly simple and can be done without a "monero" library.
Manually building a transaction is not as simple. This requires a running node and wallet file. This is because you will need (amongst other things) to select inputs and outputs. Using the JSON-RPC interface is definitely the best route for this.