<commit_before>### Major Primitives

- Pipe
- Queue
- Dealer
- Router
- Channel
- Broadcast
- Value
- State


### thoughts from Dataflow and Reactive Programming Systems:

- Only want to activate a section of code if its outputs are available

- Deemphasize pipes an instead emphasize code units<commit_msg>begin to flesh out documentation for message passing primitives<commit_after>### Major Primitives

#### Pipe

```
            +------+
            |      |
  send ---> | Pipe | ---> recv
            |      |
            +------+
```

The most basic primitive is the Pipe. A Pipe can have exactly one sender and
exactly one recver. A Pipe has no buffering, so send and recvs will block until
there is a corresponding send or recv.

For example, the following code will deadlock as the sender will block,
preventing the recv from ever being called:

```
    >>> h = vanilla.Hub()
    >>> p = h.pipe()
    >>> p.send(1)     # deadlock
    >>> p.recv()
```

The following is OK as the send is spawned to a background green thread:

```
    >>> h = vanilla.Hub()
    >>> p = h.pipe()
    >>> h.spawn(p.send, 1)
    >>> p.recv()
    1
```

- Queue
- Dealer
- Router
- Channel
- Broadcast
- Value
- State

### Major Actions

- send
- recv
- connect
- pipe
- map
- consume

- TODO:
- filter

### thoughts from Dataflow and Reactive Programming Systems:

- Only want to activate a section of code if its outputs are available

- Deemphasize pipes an instead emphasize code units
{'fraction_non_alphanumeric': 0.11246612466124661, 'fraction_numerical': 0.0020325203252032522, 'mean_word_length': 2.5419664268585134, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2036730', 'n_tokens_mistral': 459, 'n_tokens_neox': 438, 'n_words': 181}