What is insecure about this simple AES implementation?
I think it is "dangerously hard" because there are things that might go wrong that you might be unaware of. 

Below the list of things (not necessarily valid in your example) that might be the weak spot in the crypto:


is your random function random enough? If not it might be possible to predict the output
re-usage of things that should not be reused - keys, nounce etc.
timing attacks - does your code uses the same amount of time independently on where during the algorithm it fails or succeeds?
is there not side channel attack? - that can be used to determine the plaintext or part of the crypto


and the list is not complete. 

I think in general the "bad at crypto" means that people are bad at implementing the algorithms and should not do it. 

Use something that's there implemented by smarter people. 
If you do it can still be misused (cases with re-using things that should not be reused or using not-random enough random numbers) but at least the implementation should be better and resistant to some attacks.