PostgreSQL ensure no concurrent reads
I need to somehow make those reads be processed only one-by-one,
  because if I have 2 concurrent queries, both would read, get that the
  sum is less than 100 and both insert, which would result in an
  undesired state, which would have been avoided if queries were
  executed sequentially.


That's a typical use case for the serializable isolation level, with an automated retry of the transaction when it fails with a serialization failure (SQLSTATE=40001)

Short of adapting your schema specifically to deal with the concurrency issue, the other techniques you mention are not going to work directly anyway:


the BEFORE INSERT trigger is limited in visibility to the already committed transactions, so sum(value) &lt;= 100-newvalue may be true even  though another transaction has already inserted a row that will make this untrue as soon as it commits.
In the select for update technique, what row(s) is it supposed to lock? Even if doing select for update on the entire table, that does not prevent reads or new inserts. The select for update technique would work if it targeted a single pre-existing row, that the transaction would need to lock before proceeding further, implementing effectively a critical section.
But that table/row does not exist in your schema as mentioned in the question.