Is this a correct understanding of transactions?
TRUNCATE is indeed very fast, but it has to take an ACCESS EXCLUSIVE lock on the table.
For this, the query has to wait until all concurrent transactions that use the table (even if only for a SELECT!) are done. Only then can it take the lock and execute the actual truncation.
To make it faster, see that concurrent transactions are short. 16 seconds is an awfully long time for a database transaction.
To your questions:

All the transactions that started before the TRUNCATE (and that block it) will see the complete, untruncated table.
All transactions that start after the TRUNCATE will be blocked until the TRUNCATE's transaction is done, even if they only SELECT from the table.

If you TRUNCATE and INSERT in the same transaction, the ACCESS EXCLUSIVE lock is held until the whole transaction is done.
So it will be like in the previous case, but the transactions that started later will see the table filled immediately.