I'd suggest you to start from making an offline blockchain-parser.
Use the block stored on disk and start parsing them in order to build (and update) the UTXO database.
This is the most crucial and performance critical part - if you have it working, the network part will not need much more of the resources.
Later, when you start playing with the network part, you will likely encounter problems that are much harder to analyse and fix, because to the asynchronous matter of the events.
Still having a stable (and well performing) blockchain parser will benefit you hugely at this stage.
Also I'd advise you to not implement memory pool and transaction relaying from the start - make sure that processing of new blocks is stable before adding the memory pool feature.