Is my AES-128-CTR implementation secure enough to encrypt private keys and mnemonic seed?
This is not secure at all. It's technically off-topic since it's a coding question, but this implementation contains many basic errors. One example is using an insecure random number generator, which utterly destroys the security of the encryption. Another is using AES-128-CTR without authentication.  Do not try to implement your own cryptographic primitives, it takes a ton of work and is prone to obscure errors causing total failure. Use an existing library that provides constructions based on secure primitives that do what you need. That pretty much means libsodium, libhydrogen, tweetnacl-js, or a similar library.

If you use libsodium there's a version compiled to JS: https://github.com/jedisct1/libsodium.js

Documentation here: https://download.libsodium.org/doc/

You're looking for the authenticated encryption functions (crypto_secretbox_easy and its helpers). 

Libsodium can encrypt whatever you want. Also the bitcoin private keys are just bitstrings, just like the Ethereum private keys. They can be represented in hexadecimal just as easily as any other encoding.